Сначала я бы посоветовал взглянуть на эту ветку , чтобы получить немного информации о чтении из 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