Решение
Прежде всего, как вы показываете в своих примерах, вам нужно сопоставить символы, отличные от a-zA-Z0-9
, поэтому мы должны просто использовать сопоставитель .
, он будет соответствовать каждому символу.
Поэтому я думаю, что искомое выражение может быть таким:
(.*?):(?!.*:) (.*)
Вы можете использовать его так:
import re
pattern = r"(.*?):(?!.*:) (.*)"
matcher = re.compile(pattern)
txt1 = "A: "
txt2 = ":: )5: "
txt3 = "Delicious :): I want to eat this again"
result1 = matcher.search(txt1).groups() # ('A', '')
result2 = matcher.search(txt2).groups() # (':: )5', '')
result3 = matcher.search(txt3).groups() # ('Delicious :)', 'I want to eat this again')
Объяснение
Мы используем группы захвата (круглые скобки), чтобы получить разные части строки в разные группы, search
затем находит эти группы и выводит их в кортеж.
Часть (?!.*:)
называется " Negative Lookahead ", и мы используем его, чтобы убедиться, что мы начинаем захват с last :
, который мы находим.
Edit
BTW, если, как вы упомянули, у вас есть много строк, каждая из которых содержит рецензию, вы можете использовать этот фрагмент, чтобы получить все рецензии, разделенные заголовком и телом сразу:
import re
pattern = r"(.*?):(?!.*:) (.*)\n?"
matcher = re.compile(pattern)
reviews = """
A:
:: )5:
Delicious :): I want to eat this again
"""
parsed_reviews = matcher.findall(reviews) # [('A', ''), (':: )5', ''), ('Delicious :)', 'I want to eat this again')]