Python - Регулярное выражение (Re.Escape, Re.Findall); Как: найти подстроки + количество символов за подстроками внутри строки? - PullRequest
2 голосов
/ 28 мая 2020

Это может быть простой вопрос. Я изучаю, как использовать Regex, и у меня возникли проблемы с выполнением определенной задачи c для строки.

Например:

example_string = "; One, one; Two, two ; Three, three; Four, four "

desire_output = [" One, o "," Two, t "," Three, t "," Four, f "] # вывод списка в порядке

С помощью следующего, я могу получить ["One", "Two", "Three"]:

def findStringsInMiddle(a, b, text): 
    return re.findall(re.escape(a)+"(.*?)"+re.escape(b),text)

desired_output = findStringsInMiddle('; ' , ',' , example_string)

Но мне сложно понять, как правильно настроить это, чтобы захватить запятую + пробел + any_type_of_character, который мне тоже нужен.

Есть какие-нибудь советы?

Спасибо!

Ответы [ 4 ]

3 голосов
/ 28 мая 2020

Вы можете установить полный образец (от точки с запятой до второй буквы после запятой) и отметить группу, которую хотите извлечь:

>>> s =  "; One, one; Two, two; Three, three; Four, four"
>>> re.findall(r"; (.*?,.{2})", s)
['One, o', 'Two, t', 'Three, t', 'Four, f']
2 голосов
/ 28 мая 2020

Вы можете немного реорганизовать шаблон, включив правый разделитель и добавив необязательную группу (?:\s*.)?:

def findStringsInMiddle(a, b, text): 
    return re.findall(re.escape(a)+"(.*?"+re.escape(b) + r"(?:\s*.)?)",text, flags=re.S)

Шаблон будет выглядеть как ;(.*?,(?:\s*.)?) (см. демонстрация регулярного выражения ) и будет соответствовать:

  • ; - левый разделитель
  • (.*?,(?:\s*.)?) - Группа 1:
    • .*? - любой ноль или более символов, как можно меньше
  • , - запятая
  • (?:\s*.)? - необязательная группа без захвата соответствует 1 или 0 вхождения 0+ пробелов, а затем любые символы.

Примечание. Я добавил флаг re.S, чтобы . соответствовал символам разрыва строки.

Seee full Python фрагмент ниже :

import re
example_string = "; One, one; Two, two; Three, three; Four, four"
desired_output = ["One, o", "Two, t", "Three, t", "Four, f"] #list output is OK

def findStringsInMiddle(a, b, text): 
    return re.findall(re.escape(a)+"(.*?"+re.escape(b) + r"(?:\s*.)?)",text, flags=re.S)

desired_output = findStringsInMiddle('; ' , ',' , example_string)
print(desired_output)
# => ['One, o', 'Two, t', 'Three, t', 'Four, f']
1 голос
/ 28 мая 2020
import re

example_string = "; One, one; Two, two; Three, three; Four, four"

pattern = re.compile(r";\s"  # The search string must start with a semoicolon and then a space character
                     r"([A-Z][a-z]+,\s.?)"  # Here is the capturing group, containing first a capital letter,
                     # some lowercase letters
                     # and finally a comma, space and zero or one characters
                     )
print(re.findall(pattern,
                 example_string
                 )
      )

Вывод:

['One, o', 'Two, t', 'Three, t', 'Four, f']
1 голос
/ 28 мая 2020

Вот решение:

example_string = "; One, one; Two, two; Three, three; Four, four"
def findStringsInMiddle(text): 
    return re.findall("; (.+?, [a-z])",text)

desired_output = findStringsInMiddle(example_string)
desired_output

Вывод:

['One, o', 'Two, t', 'Three, t', 'Four, f']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...