Специальные символы регулярного выражения Python с введенными поисковыми строками - PullRequest
0 голосов
/ 07 февраля 2012

Благодаря помощи некоторых самых замечательных членов здесь я многое узнал о регулярных выражениях, и у меня есть эта полуработка. Мне нужно добавить символы: ", ():; -.? В мой поиск по регулярному выражению. Проблема в том, что я передаю введенные строки поиска в регулярное выражение и не знаю, как заставить это работать.

Вот код:

text = open_file.read()

grammarList = raw_input("Enter your grammar string: ");
tags = grammarList.split("^")
tags_pattern = r"\b" + r"\s+".join(r"(\w+)/{0}".format(tag) for tag in tags) + r"\b" 
# gives you r"\b(\w+)/NNP\s+(\w+)/CC\s+(\w+)/NNP\b"

from re import findall
start_position = 0

for poem in poemList:
    start_position = text.find('<' + poem + '>', start_position)
    end_position = text.find('</' + poem + '>', start_position)

    searchtext = text [start_position:end_position]
    poemname = poem
    for oldname, newname in poemtitleswapList.items():
        poemname = poemname.replace(oldname, newname)
    print poemname
    print(findall(tags_pattern, searchtext))
    print "\n"

и вот пример текстового файла:

To/TO
emotion/NN
for/IN
all/DT
there/EX
is/VBZ
in/IN
it/PRP
,/,

Отлично работает для всего, кроме запятых, круглых скобок, точек, точек с запятой, вопросительных знаков, двоеточий, тире и кавычек. Мне нужно, чтобы это тоже можно было найти. Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 07 февраля 2012

Вы можете экранировать символы, которые имеют особое значение в регулярном выражении, используя re.escape(tag).Чтобы разрешить несловарные символы слева, вы можете заменить \w+/ на [^/]+/:

pattern = r'\s+'.join(r"^([^/]+)/{0}".format(re.escape(tag)) for tag in tags)
print re.findall(pattern, searchtext, re.M)

Вывод

[('is', 'in', 'it', ',')]
...