Я пытаюсь определить, начинается ли строка (предложение) с нумерации или алфавитного маркера, за которым следует точка (.) или пробел. У меня есть регулярное выражение вроде:
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, чтобы проверить, что означает регулярное выражение и имеет ли оно смысл для вашего случая.