在this question的帮助之后,我有一个正则表达式:
A。查找包含数字的单词,例如1.2
(但那不是最后一场比赛......)
B。如果可能,将匹配向左和向右延伸到另一个包含数字的单词,只要每个单词之间不超过三个不包含数字的单词包含单词的数字。
C。将匹配向左和向右延伸,以包含4个包含非数字的单词的序列。
sample = "AA AA AA AA AA AA 1.2 BB 1.2 BB 1.3 BB BB BB BB BB"
matches = re.findall(r'(?=(\s(?:[^\d\s]+[\s]+){4}(?:[^\d\s]*\d+(?:[^\d\s]+[\s]+){1,3}?)*?[^\d\s]*\d+.*?(?:[\s]+[^\d\s]+){4}\s))', sample)
匹配:AA AA AA AA 1.2 BB 1.2 BB 1.3 BB BB BB BB
请帮我修改这个正则表达式。我仍然希望它能够完成A点和B点,而不是C,我想获得0-4尾随和起始单词的所有25个序列组合。
这是我想要的输出:
"AA AA AA AA 1.2 BB 1.2 BB 1.3 BB BB BB BB"
"AA AA AA 1.2 BB 1.2 BB 1.3 BB BB BB BB"
"AA AA 1.2 BB 1.2 BB 1.3 BB BB BB BB"
"AA 1.2 BB 1.2 BB 1.3 BB BB BB BB"
"1.2 BB 1.2 BB 1.3 BB BB BB BB"
"AA AA AA AA 1.2 BB 1.2 BB 1.3 BB BB BB"
"AA AA AA 1.2 BB 1.2 BB 1.3 BB BB BB"
"AA AA 1.2 BB 1.2 BB 1.3 BB BB BB"
"AA 1.2 BB 1.2 BB 1.3 BB BB BB"
"1.2 BB 1.2 BB 1.3 BB BB BB"
"AA AA AA AA 1.2 BB 1.2 BB 1.3 BB BB"
"AA AA AA 1.2 BB 1.2 BB 1.3 BB BB"
"AA AA 1.2 BB 1.2 BB 1.3 BB BB"
"AA 1.2 BB 1.2 BB 1.3 BB BB"
"1.2 BB 1.2 BB 1.3 BB BB"
"AA AA AA AA 1.2 BB 1.2 BB 1.3 BB"
"AA AA AA 1.2 BB 1.2 BB 1.3 BB"
"AA AA 1.2 BB 1.2 BB 1.3 BB"
"AA 1.2 BB 1.2 BB 1.3 BB"
"1.2 BB 1.2 BB 1.3 BB"
"AA AA AA AA 1.2 BB 1.2 BB 1.3"
"AA AA AA 1.2 BB 1.2 BB 1.3"
"AA AA 1.2 BB 1.2 BB 1.3"
"AA 1.2 BB 1.2 BB 1.3"
"1.2 BB 1.2 BB 1.3"
理想情况下,这可以使用初始正则表达式完成。
答案 0 :(得分:2)
让我们看一下伪代码的解决方案,这样我们就不会陷入具体的困境 - 特别是因为我可能误解了规范。
据我了解,您想要生成的组合将围绕枢轴点构建。
(G1)(Pivot)(G2)
的正则表达式,其中捕获G1和G2是枢轴周围最长的允许扩展("翼")。Pivot和Wings的示例正则表达式
在the demo中,您可以检查第1组,第2组和第3组。枢轴是第一个1.2
。左翼是AA AA AA AA
。右翼是BB 1.2 BB 1.3 BB BB BB BB
。
请注意,通过使.*?
贪婪,我们获得了不同的匹配。在这种情况下,枢轴为1.3
,左翼为AA AA AA AA 1.2 BB 1.2 BB
,右翼为BB BB BB BB
(见demo)。
这里有一些代码可以帮助您入门。
import re
subject = "AA AA AA AA AA AA 1.2 BB 1.2 BB 1.3 BB BB BB BB BB"
myregex = r"""(?x)
( # Start Group 1: the left wing
# The four first words
(?:[^\d\s]+[ ]){4}
# The optional digit-non-digit groups
(?:
\S*\d\S*[ ] # a digit-containing word
(?:[^\d\s]+){1,3}[ ] # 1 to 3 non-digit words
)*?
) # Close Group 1 (the left wing)
# The Pivot
(\S*\d\S*)
( # Start Group 2: the right wing
# Get to the Last Required Digit Word
(?:
(?:[ ][^\d\s]+){1,3} # 1 to 3 non-digit words
[ ]\S*\d\S* # a digit-containing word
)*
# The four last words
(?:[ ][^\d\s]+){4}
) # End Group 2: the right wing
"""
match = re.search(myregex,subject)
leftwing = match.group(1)
pivot = match.group(2)
rightwing = match.group(3)
wordregex = re.compile("\S+")
print("Left Wing Tokens: ",wordregex.findall(leftwing))
print("Pivot: ", pivot)
print("Left Wing Tokens: ",wordregex.findall(rightwing))
print("Now it's up to you to write the loops to build the combinations!")
<强>输出强>
Left Wing Tokens: ['AA', 'AA', 'AA', 'AA']
Pivot: 1.2
Left Wing Tokens: ['BB', '1.2', 'BB', '1.3', 'BB', 'BB', 'BB', 'BB']
Now it's up to you to write the loops to build the combinations!