Как сопоставить строку с синтаксисом регулярных выражений? - PullRequest
3 голосов
/ 15 марта 2012

Предположим, у меня есть строка типа

x = "spam ?and eggs"

И я пытаюсь соответствовать этому "?and". В настоящее время я делаю это так:

>>> print re.findall(re.escape('?and'), x)
['?and']

Это правильный вариант использования для re.escape? Будет ли он работать с любым другим строковым литералом, который я ищу, который может иметь другие типы синтаксиса регулярных выражений?

Мой вариант использования с аргументом в pexpect.spawn.expect(pattern), где шаблон ввода может быть строковым типом, который компилируется в регулярное выражение. В некоторых случаях то, что я ищу, может выглядеть как регулярное выражение, но на самом деле это строковый литерал, которому я хочу соответствовать.

Ответы [ 3 ]

6 голосов
/ 15 марта 2012

Да, это именно правильный вариант использования для re.escape & mdash; документация говорит, что это "полезно, если вы хотите сопоставить произвольную литеральную строку, которая может содержать метасимволы регулярного выражения" & mdash; хотя в вашем первом примере я думаю, что немного проще избежать знака вопроса, используя любой из них:

re.findall(r'\?and', x)          # \? in a raw string literal
re.findall('\\?and', x)          # \? in a non-raw string literal, so, \\?
re.findall('[?]and', x)          # "cheat" by using a character class
2 голосов
/ 07 июня 2012

Для pexpect, вы можете использовать wait_exact () вместо wait (), чтобы отключить функцию регулярного выражения, и она будет точно соответствовать строке Python, которую вы ей дадите.

Из документов:

ожидаемое_ точное (self, pattern_list, timeout = -1, searchwindowsize = -1)
Это похоже на ожидание (), но использует простое сопоставление строк вместо скомпилированные регулярные выражения в 'pattern_list'. 'Pattern_list' может быть строкой; список или другая последовательность строк; или TIMEOUT и EOF.

Этот вызов может быть быстрее, чем ожидаем () по двум причинам: строка поиск выполняется быстрее, чем соответствие RE, и можно ограничить поиск только до конца входного буфера.

Этот метод также полезно, когда вы не хотите беспокоиться о побеге символы выражения, которым вы хотите соответствовать.

0 голосов
/ 15 марта 2012

Да, это выглядит правильно для меня. Если вы избегаете всего своего шаблона, обычно это хороший признак того, что вы должны использовать find без регулярных выражений.

x.find('?and')

Даёт -1 или позицию. Итак ...

>>> if x.find('?and') != -1: 
...   print "Match!"
... 
Match!
...