2014-01-08 5 views
1

У меня есть список словФорматирование регулярных выражений в Python

wordlist = ['hypothesis' , 'test' , 'results' , 'total'] 

У меня есть предложение

sentence = "These tests will benefit in the long run." 

Я хочу, чтобы проверить, если слова в wordlist в предложении. Я знаю, что вы могли бы проверить, если они подстроки в предложении с помощью:

for word in wordlist: 
    if word in sentence: 
     print word 

Однако, используя подстроки, я начинаю соответствовать слова, которые не в wordlist, например, здесь test будет выступать в качестве подстроки хотя это tests, что есть в предложении. Я мог бы решить свою проблему с помощью регулярных выражений, однако, возможно ли реализовать регулярные выражения таким образом, чтобы их форматировать с каждым новым словом, то есть, если я хочу посмотреть, есть ли слово в предложении, то:

for some_word_goes_in_here in wordlist: 
    if re.search('.*(some_word_goes_in_here).*', sentence): 
     print some_word_goes_in_here 

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

+0

Если у вас есть лучший золь Я очень хочу его послушать. – kolonel

ответ

1

Попробуйте использовать:

if re.search(r'\b' + word + r'\b', sentence): 

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

Например,

>>> import re 
>>> wordlist = ['hypothesis' , 'test' , 'results' , 'total'] 
>>> sentence = "The total results for the test confirm the hypothesis" 
>>> for word in wordlist: 
...  if re.search(r'\b' + word + r'\b', sentence): 
...    print word 
... 
hypothesis 
test 
results 
total 

С вашей строки:

>>> sentence = "These tests will benefit in the long run." 
>>> for word in wordlist: 
...  if re.search(r'\b' + word + r'\b', sentence): 
...   print word 
... 
>>> 

Ничего не печатается

+0

спасибо. Да, но в этом случае ничего не должно совпадать. – kolonel

+1

@kolonel Я использовал другую строку, но позвольте мне поместить ваш в бит – Jerry

+2

Не используйте 'list' в качестве имени переменной, маскируя тип по умолчанию. –

2

Использование \b границы слов, чтобы проверить на слова:

for word in wordlist: 
    if re.search(r'\b{}\b'.format(re.escape(word)), sentence): 
     print '{} matched'.format(word) 

, но вы также можете просто разделить предложение на отдельные слова. С помощью набора для списка слов будет сделать тест более эффективным:

words = set(wordlist) 
if words.intersection(sentence.split()): 
    # no looping over `words` required. 

Демо:

>>> import re 
>>> wordlist = ['hypothesis' , 'test' , 'results' , 'total'] 
>>> sentence = "These tests will benefit in the long run." 
>>> for word in wordlist: 
...  if re.search(r'\b{}\b'.format(re.escape(word)), sentence): 
...   print '{} matched'.format(word) 
... 
>>> words = set(wordlist) 
>>> words.intersection(sentence.split()) 
set([]) 
>>> sentence = 'Lets test this hypothesis that the results total the outcome' 
>>> for word in wordlist: 
...  if re.search(r'\b{}\b'.format(re.escape(word)), sentence): 
...   print '{} matched'.format(word) 
... 
hypothesis matched 
test matched 
results matched 
total matched 
>>> words.intersection(sentence.split()) 
set(['test', 'total', 'hypothesis', 'results']) 
+0

Я рассматривал использование 're.escape' и решил против него, так как _words_ не нуждается в этом экранировании. В более общем случае это хороший совет. – Alfe

+0

@MartijnPieters Спасибо. – kolonel

+0

@MartjinPieters Я думаю, что разделение предложения на слова может привести к ошибке, так как поиск границ между словами на самом деле не является тривиальной задачей. – kolonel

1

Я хотел бы использовать это:

words = "hypothesis test results total".split() 
# ^^^ but you can use your literal list if you prefer that 
for word in words: 
    if re.search(r'\b%s\b' % (word,), sentence): 
    print word 

Вы даже можете ускорить этот процесс с помощью с использованием одного регулярного выражения:

for foundWord in re.findall(r'\b' + r'\b|\b'.join(words) + r'\b', sentence): 
    print foundWord 
+0

Благодарим вас за решение. – kolonel

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