Я пытаюсь определить, начинается ли строка (предложение) с нумерации или алфавитного маркера, за которым следует точка (.) или пробел. У меня есть регулярное выражение вроде:
r'^(\(\d|\[a-z]\))\s +'
и
r"^(?:\(\d+\)|\\[a-z]\.)\s*"
Я попробовал это на примерах строк:
(a). this is bullet
Not a bullet,
(b) its bullet again
I am so relaxed that its not bullet.
(1) Bullet again.
Но когда я пытаюсь
matches = re.findall(pattern, text, re.M)
Я получаю пустой список. Как я могу это исправить?
@mkrieger1 хорошая мысль, также отредактировал регулярное выражение для алфавитов. Пробуем предоставленную вами платформу сейчас. Спасибо
Понятно. Правильное регулярное выражение: шаблон = r"^(?:(\w+)|\[0-9]\.)\s*". Спасибо
\w
уже соответствует всем буквенно-цифровым символам и подчеркиванию. Вам не нужно явно указывать диапазон номеров. Также \[
неверно. Единственная причина, по которой это работает, заключается в том, что \w
уже делает всю работу.
Если вы пытаетесь охватить всю пулю, это правильное регулярное выражение r'\(\w+\)[. ]'
Я никогда не видел формата с круглыми скобками и точкой. Другой распространенный вариант — только закрывающая скобка, например: а) один, б) два.
Исполняемый код на Python
Решение
import re
content = """
(a). this is bullet
Not a bullet,
(b) its bullet again
I am so relaxed that its not bullet.
(1) Bullet again.
"""
patter_str = r'\((?:\w+)\)\.?\s.*'
pattern = re.compile(patter_str)
matches = pattern.findall(content)
for item in matches:
print(item)
Выход
(a). this is bullet
(b) its bullet again
(1) Bullet again.
РЕДАКТИРОВАТЬ Если вы хотите сохранить текст после маркера, вы можете использовать этот шаблон:
patter_str = r'\((?:\w+)\)\.?\s(.*)'
Вам не нужен \d
. \w
соответствует всем буквенно-цифровым символам и подчеркиванию.
Спасибо за помощь, изменение было добавлено в новый EDIT.
К вашему сведению, (?:\w+)
= \w+
.
О шаблонах, которые вы пробовали:
В вашем первом шаблоне ^(\(\d|\[a-z]\))\s +
круглые скобки неверны, поскольку они находятся внутри группировки, а в конце шаблона они соответствуют пробельному символу и 1 или более пробелам (то есть как минимум 2 «пробела»)
Второй шаблон ^(?:\(\d+\)|\\[a-z]\.)\s*
соответствует (1)
, поскольку в скобках заключаются только цифры. Также существует проблема с экранированием \\[a-z]
, и точка обязательна.
Я думаю, это легче заметить, если разбить его на отдельные части, например первый шаблон:
^
Начало строки(
Запустить группу захвата 1
\(\d
Соответствие (
и цифре|
Или\[a-z]\)
Сопоставьте [a-z])
буквально потому, что вы избежали \[
)
Закрыть группу 1\s +
Сопоставьте пробельный символ и более 1 пробела.Вы можете обновить шаблон как:
^\((?:\d|[a-z])\)[ .]
Узор соответствует:
^
Начало строки\(
Матч (
(?:
Группа без захвата (группа захвата не нужна только для сопоставления)
\d
Сопоставьте одну цифру (используйте \d+
, чтобы повторить 1 или более раз)|
Или[a-z]
Сопоставьте один символ от a до z (используйте [a-z]+
, чтобы повторить 1 или более раз))
Закройте группу без захвата\)
Матч )
[ .]
Сопоставьте пробел или точку (или \s
, чтобы сопоставить пробельный символ)Посмотрите демонстрацию регулярных выражений и демонстрацию Python
Пример (обратите внимание, что нужно добавить .*
в конец шаблона, чтобы он соответствовал всей строке)
import re
s = """(a). this is bullet
Not a bullet,
(b) its bullet again
I am so relaxed that its not bullet.
(1) Bullet again."""
pattern = r'^\((?:\d|[a-z])\)[ .].*'
print(re.findall(pattern, s, re.M))
Выход
[
'(a). this is bullet ',
'(b) its bullet again',
'(1) Bullet again.'
]
Вы, кажется, гадаете, куда и сколько обратных косых черт вставить. Вы можете использовать такой сайт, как regex101.com, чтобы проверить, что означает регулярное выражение и имеет ли оно смысл для вашего случая.