Я работаю на API Колба, который принимает следующее регулярное выражение в качестве конечной точки:python: re.search не начинается с начала строки?
([0-9]*)((OK)|(BACK)|(X))*
Это означает, что я ожидал ряд чисел, и ОК, НАЗАД, X ключевые слова несколько раз подряд после цифр.
Я хочу разбить это регулярное выражение и делать разные вещи, в зависимости от того, какие группы захвата присутствовали.
Мой подход был следующим:
endp = endp.encode('ASCII', 'ignore')
match = re.search(r"([0-9]*)", str(endp), re.I)
if match:
n = match.groups()
logging.info('nums: ' + str(n[0]))
match = re.search(r"((OK)|(BACK)|(X))*", str(endp), re.I)
if match:
s1 = match.groups()
for i in s1:
logging.info('str: ' + str(i[0]))
Использование/12OK конечной точки, получить номера работает просто отлично, но по какой-то причине, захватывая остальные ключевые слова являются безуспешными. Я попытался сокращением второй группы захвата только
match = re.search(r"(OK)*", str(endp), re.I)
Я постоянно нахожу следующее в s1 (с использованием уменьшенных регулярных выражений):
(None,)
первоначально (с остальным ключевыми словами):
(None, None, None, None)
Что, я думаю, означает, что шаблон регулярного выражения не соответствует чему-либо в моей строке endp (почему у него есть 4 Nones? 1 для каждого ключевого слова, но для чего 4-го?). Я проверил свою конечную точку (регулярное выражение и по той же строке) с помощью валидатора регулярных выражений, мне кажется, что это хорошо. Я понимаю, что re.match
должен получить совпадения с начала, поэтому я использовал метод re.search
, так как documentation указывает, что он должен совпадать в любом месте строки.
Что мне здесь не хватает? Пожалуйста, посоветуйте, я новичок в мире python.
Не могли бы вы включить образец данных, которые вы пытаетесь сопоставить? – Faibbus
Я предполагаю, что вы имеете в виду '([0-9] *) ((OK | BACK | X) *)', но я тоже хотел бы увидеть примеры того, что вы надеялись захватить, которые в настоящее время не работают. – tripleee
Что-то вроде 'OKOKOKXXXXBACKBACK' или' 0123' будет соответствовать вашему текущему регулярному выражению. Если целью является захват повторяющихся ключевых слов как отдельных групп захвата, вам нужно столько групп захвата, сколько есть ключевых слов для захвата, или более реалистично захватить все и разбить его на отдельные ключевые слова из захваченной группы. Если число может быть не более одного и порядок определен, вы просто хотите '(ОК)? (BACK)? (X)?' – tripleee