python正则表达式查找以数字为中心的子串并生成组合

时间:2014-07-18 02:04:50

标签: python regex string digit

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"

理想情况下,这可以使用初始正则表达式完成。

1 个答案:

答案 0 :(得分:2)

让我们看一下伪代码的解决方案,这样我们就不会陷入具体的困境 - 特别是因为我可能误解了规范。

据我了解,您想要生成的组合将围绕枢轴点构建。

  1. 确定每个支点和最长的"翅膀" 。为此,构建匹配(G1)(Pivot)(G2)的正则表达式,其中捕获G1和G2是枢轴周围最长的允许扩展("翼")。
  2. 使用两个for循环在代码中构建组合。在代码中,将G1和G2拆分为单词,并使用两个嵌套for循环构建所有可能的组合。
  3. 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!