Присвоение регулярных выражений Python именованным группам - PullRequest
11 голосов
/ 26 апреля 2010

Когда вы используете переменные (это правильное слово?) В регулярных выражениях python, например: «blah (? P \ w +)» («value» будет переменной), как вы можете сделать значение переменной текст после «бла» до конца строки или определенного символа, не обращая никакого внимания на фактическое содержимое переменной. Например, это псевдокод для того, что я хочу:

>>> import re
>>> p = re.compile("say (?P<value>continue_until_text_after_assignment_is_recognized) endsay")
>>> m = p.match("say Hello hi yo endsay")
>>> m.group('value')
'Hello hi yo'

Примечание: название, вероятно, не понятно. Это потому, что я не знал, как это сказать. Извините, если я вызвал замешательство.

Ответы [ 2 ]

12 голосов
/ 26 апреля 2010

Для этого вам нужно регулярное выражение

"say (?P<value>.+) endsay"

Точка соответствует любому символу, а знак плюс указывает, что это следует повторить один или несколько раз ... поэтому .+ означает любую последовательность из одного или нескольких символов. Когда вы ставите endsay в конце, механизм регулярных выражений убедится, что все, что он соответствует, на самом деле заканчивается этой строкой.

10 голосов
/ 26 апреля 2010

Вам нужно указать, что вы хотите сопоставить, если текст, например,

say hello there and endsay but some more endsay

Если вы хотите сопоставить всю подстроку hello there and endsay but some more, ответ @ David правильный. В противном случае, чтобы соответствовать только hello there and, шаблон должен быть:

say (?P<value>.+?) endsay

со знаком вопроса после знака плюс, чтобы сделать его нежадным (по умолчанию это жадный , сожрать все, что возможно, в то же время разрешив общее совпадение; не жадный означает, что он сожрается как немного , насколько это возможно, опять же, допуская общее совпадение).

...