Регулярное выражение не найдено в строке: выполнение просто зависает - PullRequest
0 голосов
/ 29 сентября 2010

Я новичок в Python (и этот сайт);Я пытаюсь написать сценарий, который будет использовать регулярное выражение для поиска в данном файле, чтобы найти имя.Я должен распечатать различные способы, которыми имя было написано с большой буквы и сколько раз имя было найдено.Мой текущий код просто распечатает мой первый флаг и затем зависнет.Я не знаю, является ли мой цикл for или мой reg exp неправильным.Спасибо за ваше время!

import re
import sys
if __name__ == '__main__':
    print "flag"
    for line in sys.stdin:
        print(line) 
        name_count = re.search("[snyder]", line, re.I)
        variation = set(re.search(r"([snyder])", line, re.I))
    print "flag2"
    print len(name_count), variation

Ответы [ 3 ]

4 голосов
/ 29 сентября 2010

Сначала я бы посоветовал взглянуть на эту ветку , чтобы получить немного информации о чтении из stdin (если это действительно то, что вы хотите сделать).

Во-вторых, я бы подумал просто открыть файл вместо чтения из sys.stdin, используя библиотеку типа fileinput или оператор with или другой дескриптор файла .

Далее, я бы добавил, что ваше регулярное выражение, вероятно, не будет делать то, что вы ожидаете. Выражение [snyder] является классом символов, который будет соответствовать одному повторению любому символу в классе . Другими словами, это будет соответствовать отдельным буквам s, n, y, d, e или r. Если вы хотите сопоставить буквенную строку snyder, вам следует просто использовать это как выражение: re.search("snyder", line, re.I). Или, если вы не хотите совпадений подстрок (в случаях, когда snyder может появляться в другой строке), вы можете попробовать регулярное выражение \bsnyder\b.


Edit re: your comment - Здесь я укажу две вещи:

1) Хотя [s][n][y][d][e][r] семантически эквивалентно snyder, вы можете рассмотреть возможность использования последнего для удобства чтения. Класс персонажа из одного персонажа эквивалентен одному только этому персонажу (при условии, что он правильно экранирован и т. Д. При необходимости). Ваш будет работать, так что это всего лишь предложение / один на один.

2) Попробуйте использовать re.findall() вместо re.search(). Я думаю, что вы получите то, что вы хотите с чем-то вроде:

variations = []
for line in fileinput.input():
    found = re.findall(r"""snyder""", line, re.I)
    if len(found) > 0:
        variations += found
var_set = set(variations)
print var_set
print len(var_set)

Пример того, что это будет делать:

>>> print sl 
['blah', 'blah', 'what', 'is', 'this', 'BLAh', 'some', 'random', 'bLah', 'text', 'a longer BlaH string', 'a BLAH string with blAH two']
>>> li = []
>>> for line in sl:
...   m = re.findall("blah", line, re.I)
...   if len(m) > 0:
...     li += m
... 
>>> 
>>> print li   #Contains all matches
['blah', 'blah', 'BLAh', 'bLah', 'BlaH', 'BLAH', 'blAH']
>>> st = set(li)
>>> print st   #Contains only *unique* matches
set(['bLah', 'BLAH', 'BLAh', 'BlaH', 'blah', 'blAH'])
>>> print len(st)
6
>>> print len(li)
7    #1 greater than len(st) because st drops a non-unique match
3 голосов
/ 29 сентября 2010

Это не висит, его ждет ввода на стандартный ввод!замените for line in sys.stdin на что-то вроде:

import fileinput

for line in fileinput.input("sample.txt"):
0 голосов
/ 29 сентября 2010

Пока вы это делаете, измените его на:

pattern = re.compile('(snyder)')
[...]
name_count = pattern.search(line, re.I)

, чтобы не перекомпилировать регулярное выражение для каждой строки во входном файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...