Регулярное выражение: у меня проблема с использованием '|' - PullRequest
0 голосов
/ 16 января 2019
text = "a/NNP b/NNG c/NP d/NNP e/PNG" 

Я хочу вынести слова только с тегами NNP и NNG.

Итак, я попробовал:

words = re.compile('(\w+/[(NNP)|(NNG)]*)')
t = re.findall(words,text)

Тем не менее, результат продолжает показывать мне

['a/NNP', 'b/NNG', 'c/NP', 'd/NNP','e/PNG'].
How can I get only ['a/NNP','b/NNG','d/NNP']?

Ответы [ 3 ]

0 голосов
/ 16 января 2019

[] обозначает класс символов. Он не используется для группировки вещей, как в математике.

Вы можете использовать группу без захвата (?:) вместо []:

\w+/(?:NNP|NNG)\b

Если ваши строки всегда состоят из трехсимвольных троек, тогда нет необходимости в \b.

Вы можете добавить столько вариантов, сколько хотите:

\w+/(?:NNP|NNG|ABC|DEF|GHI)\b
0 голосов
/ 16 января 2019

Я бы не сказал, что для этого нужно регулярное выражение?

stuff = ('NNP', 'NNG')
text = "a/NNP b/NNG c/NP d/NNP e/PNG"
result = [i for i in text.split() if i.split("/")[1] in stuff]
# ['a/NNP', 'b/NNG', 'd/NNP']

Вышеуказанное также более эффективно, чем аналог регулярного выражения, и его легче поддерживать:

>>> import re
>>>
>>> text = "a/NNP b/NNG c/NP d/NNP e/PNG"
>>> stuff = ('NNP', 'NNG', 'VV', 'VA', 'MAG', 'MAJ', 'IC', 'VX', 'MM')
>>>
>>> def regex(reg):
...     words = re.compile(reg)
...     return re.findall(words,text)
...
>>> def notregex():
...     return [i for i in text.split() if i.split("/")[1] in stuff]
...
>>> from timeit import timeit
>>> timeit(stmt="regex(a)", setup="from __main__ import regex; a=r'\w+/(?:NNP|NNG|VV|VA|MAG|MAJ|IC|VX|MM)\b'", number=100000)
0.3145495569999639
>>> timeit(stmt="notregex()", setup="from __main__ import notregex", number=100000)
0.21294589500007532
0 голосов
/ 16 января 2019

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

import re

text = "a/NNP b/NNG c/NP d/NNP e/PNG" 
words = re.compile(r'\w+/(?:NNP|NNG)\b')
# OR words = re.compile(r'\w+/NN[PG]\b')
print(re.findall(words,text)) 
# => ['a/NNP', 'b/NNG', 'd/NNP']

См. Демо Python .

Регулярное выражение \w+/NN[PG]\b см. это демо .Он соответствует

  • \w+ - 1+ словам символов (ПРИМЕЧАНИЕ: для сопоставления только букв , замените \w+ на [^\W\d_]+)
  • /NN - /NN подстрока
  • (?:NNP|NNG) - группа без захвата, соответствующая либо NNP, либо NNG
  • [PG] - либо P, либо G
  • \b - граница слова (чтобы не совпадать с /NNGGGG или чем-либо еще).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...