Нахождение подстрок в определенном порядке в Python

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!
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!

Спасибо!

  • 0
    проверьте мой ответ здесь stackoverflow.com/a/53890918/4046632 То же самое относится, if id1 and id2 in line:
Теги:
string

4 ответа

2
Лучший ответ

Вам нужно идентифицировать 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!
2

Вы можете использовать регулярное выражение, чтобы проверить это. Одним из возможных решений является следующее:

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])
  • 1
    отлично! улучшением было бы использовать regex = re.compile(r'{}.*{}'.format(id1, id2)) и regex.search(line)
  • 0
    Спасибо! Я отредактировал ответ соответственно.
0

Просто делать

  import re
  match = re.match('pattern','yourString' )

https://developers.google.com/edu/python/regular-expressions

Таким образом, шаблон, который вы ищете, это "I (. *) Need " Regex. Сопоставить все символы между двумя строками. Возможно, вам придется создавать свой шаблон по-разному, поскольку я не знаю, есть ли исключения. Если это так, вы можете запустить regex дважды, чтобы получить подмножество вашей исходной строки, и снова, чтобы получить точное совпадение, которое вы хотите

  • 1
    Это общий случай использования, но это не один шаблон. Если 'I' - первое слово в предложении, а 'need' - последнее слово, например 'I have everything we need.' Я все еще хочу вернуть это предложение.
  • 0
    Использование регулярных выражений, безусловно, хорошая идея, но ваш ответ не удовлетворяет этому вопросу. И шаблон, который I\sneed и код re.compile('pattern','yourString' ) неверны. Пожалуйста, улучшите или удалите.
Показать ещё 1 комментарий
0

Вы можете определить функцию, которая вычисляет пересечение двух 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!']

Ещё вопросы

Сообщество Overcoder
Наверх
Меню