【问题标题】:Palindrome Pattern matching from the list of string字符串列表中的回文模式匹配
【发布时间】:2017-03-03 14:01:13
【问题描述】:

关于重复模式的一个问题

我有:

import re

a = ['123', '121', '136']
pattern_variable = '[1-9][1-9][1-9]'

for i in a:
    match = re.match(pattern_variable,i)
    if match != None:
        print(i)

现在让我们假设我只想从列表中获取 121 或 535 或 737 任何具有相同的第一和第三位置。你知道我将如何用模式变量定义它吗?

谢谢

【问题讨论】:

    标签: python regex list pattern-matching


    【解决方案1】:

    您可以使用捕获组和backreference

    r'([1-9])[1-9]\1'
    

    如果你想确保它是整个字符串:

    r'\A([1-9])[1-9]\1\Z'
    

    或者这3位数字组成一个数字:

    r'\b([1-9])[1-9]\1\b'
    

    最后 2 个正则表达式会阻止 4121 匹配 121

    更新

    如果你想匹配 121 而不是 111,你可以使用 negative lookahead

    import re
    
    a = ['123', '121', '136', '1232', '111', '1a1']
    pattern_variable = r'\b([1-9])(?!\1)[1-9]\1\b'
    
    for i in a:
        match = re.match(pattern_variable,i)
        if match != None:
            print(i)
    
    #=> 121
    

    意思是:一个字的边界,一个不跟它自己的数字,另一个数字,和第一个数字相同的数字和一个字的边界:)

    【讨论】:

    • 您好,谢谢。我可以再问一件事。您模式匹配 121,但也匹配 111。我怎么能匹配第一个位置 1 和第三个位置 1 但第二个位置不是 1 的任何东西?谢谢
    • 谢谢埃里克,非常有趣。我很感激。
    【解决方案2】:

    使用反向引用:

    pattern_variable = r'([1-9])[1-9]\1'
    

    请注意,您需要使用原始字符串文字,否则您必须将 1 转义两次。

    另外,如果你想匹配整个字符串,你需要在模式末尾添加$,因为re.match()只在开始 em> 的字符串。或者,如果您使用 Python 3.4 和更新版本,您可以使用 pattern_variable 正则表达式和 re.fullmatch() 方法。

    【讨论】:

      猜你喜欢
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 2018-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多