【问题标题】:Capture same line multiple times多次捕获同一行
【发布时间】:2019-07-03 22:58:48
【问题描述】:

给定文本,

A 0 1 2 3 4

我想将 A 与每个数字匹配为单独的匹配项,例如,

re.findall(some_regex, "A 0 1 2 3 4")

会回来,

[
  ["A", "0"],
  ["A", "1"],
  ["A", "2"],
  ["A", "3"],
  ["A", "4"],
]

【问题讨论】:

  • 这是不可能的。一个正则表达式总是匹配一个连续的子字符串。
  • 默认情况下所有正则表达式引擎,如果当前(搜索)位置与上次匹配在同一点匹配,则将当前(搜索)位置提高 1。您可以通过后视来做一些棘手的事情,但它需要使用交替进行的固定值,其中交替的数量与相应数量的捕获组固定。在 PCRE 中,您有机会将组数过滤为 2,但交替存在。在 Dot-net 中,您可以使用单一的lookbehind,无需交替(?<^(.).*)(.) walla ..

标签: python regex regex-lookarounds


【解决方案1】:
    dd ='A01234'
    Result = [[dd[0],j] for i,j in enumerate(dd) if i!=0]
    #Output = [['A', '0'], ['A', '1'], ['A', '2'], ['A', '3'], ['A', '4']]

【讨论】:

    【解决方案2】:

    这是不可能的。但是您可以轻松生成这样的列表。

    x = re.findall("A*[0-9]", "A 0 1 2 3 4")
    result = [["A", str(c)] for c in x]
    

    【讨论】:

    • 所以(A).*?(\d) 将匹配 [A, 0]。如果你让中间贪心,你会得到 4。正则表达式不能以非贪心的方式从 0 迭代到 4?
    • 不认为这是可能的。 (A)*(\d) 将得到[('', '0'), ('', '1'), ('', '2'), ('', '3'), ('', '4')],这非常接近。
    【解决方案3】:

    试试这个,我用两个 Python regex 做的。

    import re
    
    text = "A 0 1 2 3 4"  # your text here
    
    """
    select first character which belongs to alphabetically
    between a and z, lower case OR upper case. If you need
    to match only upper case character, just change pattern1
    into "^[A-Z]"
    
    pattern2 will match all the string contains with digits
    which mean numbers from 0-9
    """
    pattern1 = "^[A-Za-z]"
    pattern2 = "\d"
    
    print([[re.search(pattern1, text).group(0), a] for a in re.findall(pattern2, text)])
    

    输出是,

    [['A', '0'], ['A', '1'], ['A', '2'], ['A', '3'], ['A', '4']]
    

    现在您可以使用任意位数随意更改第一个字符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-13
      • 1970-01-01
      • 2020-11-03
      • 2015-07-18
      • 2015-01-02
      • 1970-01-01
      • 1970-01-01
      • 2017-07-11
      相关资源
      最近更新 更多