2013-04-09 2 views
1

Я пытаюсь найти слова в текстовом файле длиной 7 букв и содержать буквы a, b, c, e и r. До сих пор у меня есть следующее:найти слово в текстовом файле, который содержит определенные символы и является определенной длиной

import re 

file = open("dictionary.txt","r") 
text = file.readlines() 
file.close() 


keyword = re.compile(r'\w{7}') 

for line in text: 
    result = keyword.search (line) 
    if result: 
     print (result.group()) 

Может ли кто-нибудь мне помочь?

+2

ли слово содержит * только * буквы 'Ā',' b', 'c',' 'é' и r' или он должен содержать, по крайней мере * * эти письма? –

+0

@ Becs1990 Вы должны привыкнуть отмечать ответ, который решает вашу проблему, щелкнув галочку под голосованием. – FrankieTheKneeMan

ответ

2

Вы должны не только соответствовать символам слова, но и слово границы:

keyword = re.compile(r'\b\w{7}\b') 

\b якоря матчи в начале или в конце слова, ограничивая слово точно- персонажи.

Было бы более эффективным, если бы вы были в цикл через файл строку за строкой, а не читать все это в памяти на одном дыхании:

import re 

keyword = re.compile(r'\b\w{7}\b') 

with open("dictionary.txt","r") as dictionary:  
    for line in dictionary: 
     for result in keyword.findall(line): 
      print(result) 

Использование keyword.findall() дает нам список всех матчей на линии.

Чтобы проверить матчи, по крайней мере, один из требуемых символов в ней, лично я бы просто использовать тест набор пересечения:

import re 

keyword = re.compile(r'\b\w{7}\b') 
required = set('abcer') 

with open("dictionary.txt","r") as dictionary:  
    for line in dictionary: 
     results = [required.intersection(word) for word in keyword.findall(line)] 
     for result in results 
      print(result) 
+0

Это не вернет ничего из файла. Возвращенные слова могут содержать любые или все буквы. Я так растерялся. – Becs1990

+0

@ Becs1990: добавьте несколько слов, которые должны соответствовать вашему вопросу. –

+0

Всего в моем словаре содержится 24 000 слов. Но, к примеру: ушка отказаться abbrevi abdicat живота abdomin Абеляну Абельсону Aberdee Abernat – Becs1990

1
\b(?=\w{0,6}?[abcer])\w{7}\b 

Это регулярное выражение, которое вы хотите. Он работает, используя базовую форму для слова ровно семь букв (\b\w{7}\b) и добавляя lookahead - утверждение о нулевой ширине, которое смотрит вперед и пытается найти одну из ваших необходимых букв. Разбивка:

\b   A word boundary 
(?=   Look ahead and find... 
    \w  A word character (A-Za-z0-9_) 
    {0,6}  Repeated 0 to 6 times 
    ?   Lazily (not necessary, but marginally more efficient). 
    [abcer] Followed by one of a, b, c, e, or r 
)    Go back to where we were before (just after the word boundary 
\w   And match a word character 
{7}   Exactly seven times. 
\b   Then one more word Boundary. 
+0

Спасибо, что так много! Оно работает! В заключение! Ты легенда! – Becs1990

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