Регулярное выражение для соответствия всех слов в скобках - PullRequest
5 голосов
/ 16 июня 2019

Представьте, что это часть большого текста:

материал (word1 / Word2 / w0rd3) материал, материал (word4 / word5) материал / материал (word6) материал (word7 / word8 / word9) материал / материал, (w0rd10 / word11) материал материал (word12) материал (Word13) / w0rd14 / word15) вещи-вещи вещи (слово16 / слово17).

Я хочу слова. Результат должен совпадать:

word1
Word2
w0rd3
word4
word5
word6
word7
word8
word9
w0rd10
word11
word12
Word13
w0rd14
word15
word16
word17

Также результат не должен быть таким:

(word1) or (word1/Word2/w0rd3) 

В основном нет ( или ) или / разрешено

Что я пробовал:

\((\w+)\/(\w+)\/(\w+)\)[^(]*\((\w+)\/(\w+)\)[^(]*\((\w+)\) 

regex101

Это соответствует этим словам, но я должен продублировать их, так как существует много слов, которые не являются чистыми. Также я попробовал txt2re , но он также дублирован и не является регулярным выражением в одну строку. В случае, если я хочу использовать его в онлайн-оценщике регулярных выражений, и нет доступа к кодированию, тогда мне нужна одна строка и короткое регулярное выражение. И мой любимый движок - это Python и C #.


Обновление: Я добавил немного / в текст. Также извините за изменение принятого ответа, Все ответы в некотором роде верны, но я должен выбрать здесь самое быстрое и эффективное регулярное выражение.

Ответы [ 4 ]

3 голосов
/ 16 июня 2019

Распространенным решением является проверка, есть ли впереди закрытие ) без какого-либо открытия ( между ними.

\w+\b(?=[^)(]*\))

См. Эту демонстрацию на regex101

Таким образом, этот шаблон не проверяет открытие ( раньше, но часто это не нужно.

2 голосов
/ 16 июня 2019

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

\)?[^)]+?\(|\).+|/

Не-слово: либо:

  • необязательная закрывающая скобка, за которой следует набор символов, которые не являются закрывающими скобками, за которыми следует открывающая скобка.
  • закрывающая скобка, за которой следует какой-то текст (используется для соответствия последнему биту строки)
  • косая черта

Regex Demo

2 голосов
/ 16 июня 2019

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

Тогда в результате вы можете разделить на слеш:

\((\w+(?:/\w+)*)\)

Объяснение

  • \( Соответствие открывающим скобкам
  • ( Захватывающая группа
    • \w+ Соответствует 1+ словам символов
    • (?:/\w+)* Совпадение 0+ раз / и 1+ слов символов
  • ) Закрыть группу захвата
  • \) Соответствие закрывающей скобки

Regex demo | Python demo

Если вы хотите сопоставить больше, чем символы слова, вы можете использовать отрицательный класс символов [^()/]+, соответствующий не круглым скобкам или косой черте:

\(([^()/]+(?:/[^()/]+)*)\)

Regex demo

Например:

import re

regex = r"\(([^()/]+(?:/[^()/]+)*)\)"
test_str = "stuff (word1/Word2/w0rd3) stuff, stuff (word4/word5) stuff stuff (word6) stuff (word7/word8/word9) stuff stuff, (w0rd10/word11) stuff stuff (word12) stuff (Word13/w0rd14/word15) stuff-stuff stuff (word16/word17)."
res = list(map(lambda x: x.split('/'), re.findall(regex, test_str)))

Или см. плоскую версию .

1 голос
/ 16 июня 2019

Использовать findall с утверждением о невыезде

(?<=[(/])\w+

ССЫЛКА НА REGEX

>>> re.findall(r'(?<=[(/])\w+', input_string)
['word1', 'Word2', 'w0rd3', 'word4', 'word5', 'word6', 'word7', 'word8', 'word9', 'w0rd10', 'word11', 'word12', 'Word13', 'w0rd14', 'word15', 'word16', 'word17']

Explaination

(?<=[(/])\w+

Положительный взгляд за спиной (?<=[(/])

  • Утверждают, что приведенное ниже регулярное выражение соответствует
  • Соответствует одному символу, присутствующему в списке [(/]
    • ( или / соответствует одному символу
  • \w+ соответствует любому символу слова (равен [a-zA-Z0-9_])
    • + Квантификатор - сопоставляет от одного до неограниченного числа раз, столько раз, сколько возможно, возвращая при необходимости (жадный)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...