2016-09-27 3 views
1

Я пытаюсь использовать строку, которая будет использоваться как строка регулярных выражений.
В следующем коде:
_pattern является образцом как abba и я пытаюсь проверить _string следует за _pattern (например catdogdogcat.)
Создание строки регулярного выражения, которая будет использоваться в re.match()

rxp в следующем коде является регулярным выражением, которое я пытаюсь создать для соответствия _string (например, для примера выше это будет (.+)(.+)\\2\\1). Что успешно сгенерировано. Но re.match() возвращает None.

Я хочу понять, почему он не работает и как его исправить?

import re 

_pattern = "abba" #raw_input().strip() 
_string = "catdogdogcat" #raw_input().strip() 
hm = {} 
rxp = "" 
c = 1 
for x in _pattern: 
    if hm.has_key(x): 
     rxp += hm[x] 
     continue 
    else: 
     rxp += "(.+)" 
     hm[x]="\\\\"+str(c) 
     c+=1 

print rxp 
#print re.match(rxp,_string) -> (Tried) Not working 
#print re.match(r'rxp', _string) -> (Tried) Not working 

print re.match(r'%s' %rxp, _string) # (Tried) Not working 

Выход
(.+)(.+)\\2\\1 None

Ожидаемый результат
(.+)(.+)\\2\\1 <_sre.SRE_Match object at 0x000000000278FE88>

+1

Боковое примечание: 'dict.has_key' устарел на века. 'hm.has_key (x)' может измениться на 'x в hm' и работает быстрее, в не-устаревшем, более совместимом с остальным способом Python. Точно так же 'not hm.has_key (x)' лучше выражается как 'x not in hm'. – ShadowRanger

+0

@ShadowRanger Я запомню это. Благодаря! – lordzuko

ответ

1

Дело в том, что ваша строковая переменная регулярного выражения имеет двойной \\ вместо одного.

Вы можете использовать

rxp.replace("\\\\", "\\") 

в .match так:

>>> print re.match(rxp.replace("\\\\", "\\"), _string) 
<_sre.SRE_Match object at 0x10bf87c68> 

>>> print re.match(rxp.replace("\\\\", "\\"), _string).groups() 
('cat', 'dog') 

EDIT:

Вы также можете избежать двойной \\ как это: импорт re

_pattern = "abba" #raw_input().strip() 
_string = "catdogdogcat" #raw_input().strip() 
hm = {} 
rxp = "" 
c = 1 
for x in _pattern: 
    if x in hm: 
     rxp += hm[x] 
     continue 
    else: 
     rxp += "(.+)" 
     hm[x]="\\" + str(c) 
     c+=1 

print rxp 
print re.match(rxp,_string) 
+0

Вот что я догадался. замена отлично работает и служит моей цели. Можете ли вы сказать мне, есть ли способ написать это, чтобы я мог избежать «\\\\» при создании ** rxp **? – lordzuko

+0

Да, это можно сделать, см. Отредактированный ответ. – anubhava

+1

Здесь я совершил ошибку. Просто прочитайте, что, поскольку я собираюсь использовать строку в регулярном выражении, мне не нужно беспокоиться о обратной косой чертой. Благодаря!! – lordzuko

0

Вы должны использовать форматирования строк, а не жесткий код rxp в строку:

print re.match(r'%s'%rxp, _string) 
+0

Я тоже это пробовал, если это правильно, '_string' должен соответствовать регулярному выражению' rxp' ryt? Но этого не происходит. – lordzuko

+0

Что показывает 'print rxp'? –

+0

'(. +) (. +) \\ 2 \\ 1' – lordzuko

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