正则表达式用于语音选择的特定组

时间:2019-06-06 12:45:16

标签: python regex

嘿,我一直在尝试使用正则表达式来选择这些pos模式

JJ JJ JJ JJ 
JJ JJ JJ NNS 
JJ JJ NN NN 
JJ JJ NN
JJ JJ NNS
JJ JJ RB
JJ JJ
JJ NN IN DT JJ
JJ NN JJ NNS
JJ NN JJ
JJ NN NN NN
JJ NN NN
JJ NN NNS
JJ NN
JJ NNP
JJ NNS IN NN
JJ NNS IN NN
JJ NNS NN
JJ NNS NNS
JJ NNS
JJ VBG NNS
JJ VBZ NNS
JJR NN

我尝试了以下正则表达式,但似乎并没有选择所有可以帮助我的东西。

(((JJ|NN)\w?)+ ((NN\w?\s?)+|(JJ\s?)+|(RB\s?)+|(IN\s?)+|(DT\s?)+|(VB\w?\s?)+))

2 个答案:

答案 0 :(得分:2)

您可以简单地从带有|分隔符的模式列表中构建一个表达式。您只需要确保较长的模式出现在较短的模式之前,因为|运算符并不贪婪:

patterns = """JJ JJ JJ JJ 
JJ JJ JJ NNS 
JJ JJ NN NN 
JJ JJ NN
JJ JJ NNS
JJ JJ RB
JJ JJ
JJ NN IN DT JJ
JJ NN JJ NNS
JJ NN JJ
JJ NN NN NN
JJ NN NN
JJ NN NNS
JJ NN
JJ NNP
JJ NNS IN NN
JJ NNS IN NN
JJ NNS NN
JJ NNS NNS
JJ NNS
JJ VBG NNS
JJ VBZ NNS
JJR NN"""

import re
pattern = "|".join(sorted(patterns.split("\n"),key=len,reverse=True))

results = re.findall(pattern,patterns) # finds them all in 0.009 ms

这比复杂表达式快3倍:

pattern = '^((JJ(?:R)*\s*)+\s*((((NN(?:S|P)*|VB(:?G|Z)*|RB|JJ)\s*))+\s*)+(((IN|NN(?:S|P)*|DT|JJ)\s*))*)$'
results = re.findall(pattern,patterns) 
# takes forever (possibly because of new lines in the text).

# taking end of lines out of the equation:
singleLine = patterns.replace("\n","*")
result     = re.findall(pattern, singleLine)
# takes 0.030 ms

答案 1 :(得分:0)

正则表达式解决方案,效率不如@Alain。它匹配所有所需的字符串,没有其他匹配项:

^JJR? (?:JJ|NN[PS]?|VB[GZ]?)(?: (?:JJ|NNS?|RB|IN)(?: (?:JJ|NNS?|DT)(?: JJ)?)?)? *$

Demo