У меня есть длинный список строк, которые содержат интересующие их подстроки в том порядке, в котором они даны, но вот небольшой пример использования предложений в текстовом файле:
This is a long drawn out sentence needed to emphasize a topic I am trying to learn.
It is new idea for me and I need your help with it please!
Thank you so much in advance, I really appreciate it.
Из этого текстового файла я хотел бы найти любые предложения, содержащие как "I"
и "need"
но они должны встречаться в таком порядке.
Таким образом, в этом примере 'I'
и 'need'
встречаются в предложении 1 и предложении 2, но в предложении 1 они расположены в неправильном порядке, поэтому я не хочу возвращать это. Я только хочу вернуть второе предложение, так как оно имеет 'I need'
по порядку.
Я использовал этот пример для определения подстрок, но я не могу понять, как найти их только по порядку:
id1 = "I"
id2 = "need"
with open('fun.txt') as f:
for line in f:
if id1 and id2 in line:
print(line[:-1])
Это возвращает:
This is a long drawn out sentence needed to emphasize a topic I am trying to learn.
It is new idea for me and I need your help with it please!
Но я хочу только:
It is new idea for me and I need your help with it please!
Спасибо!
Вам нужно идентифицировать id2
в части строки после id1
:
infile = [
"This is a long drawn out sentence needed to emphasize a topic I am trying to learn.",
"It is new idea for me and I need your help with it please!",
"Thank you so much in advance, I really appreciate it.",
]
id1 = "I"
id2 = "need"
for line in infile:
if id1 in line:
pos1 = line.index(id1)
if id2 in line[pos1+len(id1) :] :
print(line)
Выход:
It is new idea for me and I need your help with it please!
Вы можете использовать регулярное выражение, чтобы проверить это. Одним из возможных решений является следующее:
id1 = "I"
id2 = "need"
regex = re.compile(r'^.*{}.*{}.*$'.format(id1, id2))
with open('fun.txt') as f:
for line in f:
if re.search(regex, line):
print(line[:-1])
regex = re.compile(r'{}.*{}'.format(id1, id2))
и regex.search(line)
Просто делать
import re
match = re.match('pattern','yourString' )
https://developers.google.com/edu/python/regular-expressions
Таким образом, шаблон, который вы ищете, это "I (. *) Need " Regex. Сопоставить все символы между двумя строками. Возможно, вам придется создавать свой шаблон по-разному, поскольку я не знаю, есть ли исключения. Если это так, вы можете запустить regex дважды, чтобы получить подмножество вашей исходной строки, и снова, чтобы получить точное совпадение, которое вы хотите
'I'
- первое слово в предложении, а 'need'
- последнее слово, например 'I have everything we need.'
Я все еще хочу вернуть это предложение.
I\sneed
и код re.compile('pattern','yourString' )
неверны. Пожалуйста, улучшите или удалите.
Вы можете определить функцию, которая вычисляет пересечение двух sets
(каждое из предложений и I need
), и использовать sorted
по key
который сортирует результат в том же порядке появления, что и в предложении. Таким образом, вы проверяете, соответствует ли результирующий порядок списков тому, который I need
:
a = ['I','need']
l = ['This is a long drawn out sentence needed to emphasize a topic I am trying to learn.',
'It is new idea for me and I need your help with it please!',
'Thank you so much in advance, I really appreciate it.']
Самоопределенная функция. Возвращает True
если строки содержатся в том же порядке:
def same_order(l1, l2):
inters = sorted(set(l1) & set(l2.split(' ')), key = l2.split(' ').index)
return True if inters == l1 else False
Возвращает заданную строку в списке l
если возвращается True
:
[l[i] for i, j in enumerate(l) if same_order(a, j)]
#['It is new idea for me and I need your help with it please!']
if id1 and id2 in line: