Могу ли я создать набор RegEx, содержащий метасимволы? - PullRequest
2 голосов
/ 17 октября 2019

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

Я попытался написать RegEx, который включает в себя набор, содержащий ряд возможных начала / окончания словавключая обычные символы, такие как пробел, запятая, точка остановки и т. д. Также необходимо включить метасимволы, такие как новая строка и конец строки.

Вот пример строки и тип регулярного выражения I 'я пытался использовать:

text = "abcd aacd. abcd\n adcd"

my_re = re.compile(r'[ ^]a\wcd[ .,$]')
pat_iter = my_re.finditer(text)

for i in pat_iter:
    print(i.group())

Вывод, который я хотел бы получить из этого:

abcd 
aacd.
abcd

adcd

К сожалению, я не могу использовать метасимволы, такие как ^, \n и $ в наборе в квадратных скобках, [].

Есть ли какой-либо способ отменить экранирование этих символов в наборе, чтобы их можно было использовать в качестве метасимволов?

Редактировать: я не хочу разделять эти слова, используя что-то вроде разбиения везде, где есть пробел, например:

text = text.split(" ")

Это должно быть с RegEx, как я описал выше.

Ответы [ 3 ]

1 голос
/ 17 октября 2019

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

'a\wcd[ \.\n]|a\wcd$'

Пример :

import re

text = "abcd aacd. abcd\n adcd"

my_re = re.compile(r'a\wcd[ \.\n]|a\wcd$')
pat_iter = my_re.finditer(text)

for i in pat_iter:
    print(i.group())

# abcd
# aacd.
# abcd

# adcd
1 голос
/ 17 октября 2019

Вы можете использовать

\ba\wcd[.,]?\s*

По частям

  • \ba Соответствует границе слова, за которой следует a
  • \w Соответствует символу слова
  • cd Соответствует cd буквально
  • [.,]? Соответствует необязательному . или ,
  • \s* Соответствует 0+ пробелам, которые также будут соответствоватьпереводы строк

Regex demo | Python demo

Например

import re
text = "abcd aacd. abcd\n adcd"

my_re = re.compile(r'\ba\wcd[.,]?\s*')
pat_iter = my_re.finditer(text)

for i in pat_iter:
    print(i.group())

Вывод

abcd 
aacd. 
abcd

adcd
0 голосов
/ 17 октября 2019

Будет ли это регулярное выражение работать? [ \^]*a\wcd[ .,$]* (проверено с очень полезным https://regex101.com).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...