2011-06-26 2 views
0

Может кто-нибудь помочь мне понять, почему это работает ...не может передать значение в re.findall (питон)

z = re.findall(r'(foobar)', string) 

Но это не делает?

regexStr = "r'(foobar)'" 
z = re.findall(regexStr, string) 

Я распечатан regexStr и определил, что это выход идентичный г '(Foobar).

Может кто-нибудь помочь? Я также попытался избежать апострофов.

JD

ответ

0

Решение вашей проблемы

regexStr = r'(%s)' % searchString 

где SearchString заменит% s

В Python часто лучше использовать эту конструкцию, чем обычные конкатенации. (что означает str1 + str2 + ...) Тем более, что вам не нужно заботиться о преобразовании удвоений ints и т. д.

Больше на эту тему здесь: 3.5. Formatting Strings

The R не должно быть частью строки, он только говорит интерпретатор питона, какие строки это:

r('hello\n') # Raw string => (hello\n) 
u'unicodestring' 
+0

Awesome. Большое спасибо! – jond

3

«г» модификатор на строки должны быть вне кавычек

regexStr = r'(foobar)' 

Из docs - «строковые литералы необязательно может быть префиксом с буквой„R“или„R“ , такие строки называются необработанными строками и используют разные правила для интерпретации escape-последовательностей обратной косой черты ».

+0

Интересно. Я думал, что когда вы назначаете строку текстовой переменной, вам нужно включить кавычки вокруг строки. Спасибо, Rich! – jond

+0

На самом деле мне нужно передать значение foobar в эту строку, например . Поскольку решение, которое вы мне дали, не включает кавычки вокруг всей строки, как я могу конкатенировать строку, как показано выше? – jond

+0

@jond _ "Модификатор" r "на строке должен быть вне кавычек " _ Так что ** "r '(" ** неверно. Возможно, вы хотите сделать: '' RegexPatternString = re.escape (searchString) .join ('()') '' – eyquem

0

Модификатор r строит raw строка. Он сообщает Python не преобразовывать escape-последовательности обратного слэша в специальные символы, такие как \t или \n, для встроенных строк. Это не имеет никакого отношения к последовательностям escape-последовательности регулярного выражения.

>>> len('\t') # tab character only 
1 
>>> len(r'\t') # backslach character followed by a tee 
2 

Однако синтаксис регулярных выражений имеет свой собственный набор правил, которые спасаясь часто конфликтовать с правилами эвакуации из встроенных строк Python. Ключевое слово r помогает нам справляться только с одним. Например, первая строка ниже представляет собой текст регулярного выражения, который соответствует символам слов, так же как и второй, поскольку Python преобразует \\ в \ для встроенных строк, если не указано ключевое слово r.

>>> re.compile(r'\w') == re.compile('\\w') 
True 

В вашем случае r'(foobar)' в точности эквивалентно '(foobar)', потому что нет последовательности обратной косой черты, чтобы избежать. Эта строка является регулярным выражением текст только в вашем уме. Ключевое слово r не говорит Python интерпретировать строку таким образом. Python знает только о регулярном выражении объектов, которые вы создаете с помощью re.compile() или которые по своей сути скомпилированы с помощью таких методов, как re.findall().

Компиляция объектов регулярных выражений имеет свой собственный набор правил, отличный от встроенных правил escape-последовательности строки, а правила регулярных выражений не связаны с ключевым словом r. Компилятор регулярных выражений не понимает его особого значения, только интерпретатор Python.

В вашем случае ключевое слово r в "r'(foobar)'" не имеет специального лечения, поскольку оно напрямую передается компилятору регулярных выражений. Вы эффективно создаете регулярное выражение, которое ищет строку, начинающуюся с ", а затем r и так далее. Вот почему два выражения отличаются друг от друга.

>>> re.compile(r'(foobar)') == re.compile('"r(foobar)"') # your expressions 
False 

Использование в r ключевое слово не имеет никакого эффекта здесь:

>>> re.compile(r'(foobar)') == re.compile('(foobar)') 
True 
>>> re.compile(r'"r(foobar)"') == re.compile('"r(foobar)"') 
True 

Для получения дополнительной информации:

Смежные вопросы