Регулярное выражение для соответствия начальной нумерации или алфавитным маркерам, например (a)

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

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)

Я получаю пустой список. Как я могу это исправить?

Вы, кажется, гадаете, куда и сколько обратных косых черт вставить. Вы можете использовать такой сайт, как regex101.com, чтобы проверить, что означает регулярное выражение и имеет ли оно смысл для вашего случая.

mkrieger1 21.08.2024 03:06

@mkrieger1 хорошая мысль, также отредактировал регулярное выражение для алфавитов. Пробуем предоставленную вами платформу сейчас. Спасибо

Swati 21.08.2024 03:17

Понятно. Правильное регулярное выражение: шаблон = r"^(?:(\w+)|\[0-9]\.)\s*". Спасибо

Swati 21.08.2024 03:23
\w уже соответствует всем буквенно-цифровым символам и подчеркиванию. Вам не нужно явно указывать диапазон номеров. Также \[ неверно. Единственная причина, по которой это работает, заключается в том, что \w уже делает всю работу.
OysterShucker 21.08.2024 04:33

Если вы пытаетесь охватить всю пулю, это правильное регулярное выражение r'\(\w+\)[. ]'

OysterShucker 21.08.2024 04:52

Я никогда не видел формата с круглыми скобками и точкой. Другой распространенный вариант — только закрывающая скобка, например: а) один, б) два.

tripleee 21.08.2024 06:14
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
6
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Исполняемый код на 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 соответствует всем буквенно-цифровым символам и подчеркиванию.

OysterShucker 21.08.2024 04:29

Спасибо за помощь, изменение было добавлено в новый EDIT.

camilo_chart 21.08.2024 05:09

К вашему сведению, (?:\w+) = \w+.

Wiktor Stribiżew 21.08.2024 09:58

О шаблонах, которые вы пробовали:

  1. В вашем первом шаблоне ^(\(\d|\[a-z]\))\s + круглые скобки неверны, поскольку они находятся внутри группировки, а в конце шаблона они соответствуют пробельному символу и 1 или более пробелам (то есть как минимум 2 «пробела»)

  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.'
]

Другие вопросы по теме