Вы близко :) Передай это выстрел:
for each_line in txtFreeForm:
match = re.search('add roth (?!in[-]plan)',each_line.lower())
if match is not None:
print(each_line[match.end():])
EDIT: Ааа я неправильно понял ... У вас есть много из них. Это требует более агрессивной магии.
import re
from functools import partial
txtFreeForm = ['Add roth Sweep non vested money after 5 years of termination',
'Add roth in-plan to the 401k plan.']
def roths(rows):
for row in rows:
match = re.search('add roth\s*', row.lower())
if match:
yield row, row[match.end():]
def filter_pattern(pattern):
return partial(lazy_filter_out, pattern)
def lazy_filter(pattern):
return partial(lazy_filter, pattern)
def lazy_filter_out(pattern, rows):
for row, rest in rows:
if not re.match(pattern, rest):
yield row, rest
def magical_transducer(bad_words, nice_rows):
magical_sentences = reduce(lambda x, y: y(x), [roths] + map(filter_pattern, bad_words), nice_rows)
for row, _ in magical_sentences:
yield row
def main():
magic = magical_transducer(['in[-]plan'], txtFreeForm)
print(list(magic))
if __name__ == '__main__':
main()
Чтобы немного рассказать о происходящем, вы упомянули, что у вас есть много этих слов для обработки. Традиционный способ сравнения двух групп элементов - с вложенными петлями. Так,
results = []
for word in words:
for pattern in patterns:
data = do_something(word_pattern)
results.append(data)
for item in data:
for thing in item:
and so on...
and so fourth...
Я использую несколько различных методов, чтобы попытаться добиться реализации «льстить» и избегать вложенных циклов. Я сделаю все возможное, чтобы описать их.
**Function compositions**
# You will often see patterns that look like this:
x = foo(a)
y = bar(b)
z = baz(y)
# You may also see patterns that look like this:
z = baz(bar(foo(a)))
# an alternative way to do this is to use a functional composition
# the technique works like this:
z = reduce(lambda x, y: y(x), [foo, bar, baz], a)
Почему две строки не должны возвращаться, если они оба содержат «Добавить роуд»? –
'if 'add roth' в each_line.lower(): ...' это гораздо более дешевый способ решения этой проблемы. Не требуется 're'. – DyZ
Я согласен, что «in» - это более дешевый способ сделать это. @AndreiSavin, я знаю, что он вернет оба, если их найти в тексте. но я ищу способ разграничения предложений, которые содержат только «add roth» и те, которые содержат «add roth in plan» –