【问题标题】:regular expression match issue in PythonPython中的正则表达式匹配问题
【发布时间】:2016-11-27 14:05:36
【问题描述】:

对于输入字符串,要匹配以{(P) 开头并以(P)} 结尾的文本,我只想匹配中间的部分。想知道我们是否可以编写一个正则表达式来解决这个问题?

例如,在以下示例中,对于输入字符串,我要检索 hello world 部分。使用 Python 2.7。

python {(P)hello world(P)} java

【问题讨论】:

    标签: python regex python-2.7


    【解决方案1】:

    您可以尝试{\(P\)(.*)\(P\)},并在模式中使用括号来捕获{(P)(P)} 之间的所有内容:

    import re
    re.findall(r'{\(P\)(.*)\(P\)}', "python {(P)hello world(P)} java")
    
    # ['hello world']
    

    .* 也匹配 unicode 字符,例如:

    import re
    str1 = "python {(P)£1,073,142.68(P)} java"
    str2 = re.findall(r'{\(P\)(.*)\(P\)}', str1)[0]
    
    str2
    # '\xc2\xa31,073,142.68'
    
    print str2
    # £1,073,142.68
    

    【讨论】:

    • 感谢 Psidom,为您的解决方案投票。我发现如果两个(P)之间有ASCII,就可以成功输出。但是如果中间有unicode字符,输出(我用print re.findall(r'{\(P\)(.*)\(P\)}', "python {(P)hello world(P)} java")输出)会很奇怪,比如['\xe5\x8e\],有什么想法在使用print输出时将它们转换回unicode字符?
    • Unicode 字符的捕获方式与 ASCII 字符相同。您只需要很好地打印它们即可查看实际内容。我会更新答案以反映这一点。
    • 酷 Psidom,投票,期待您的回复。
    • 您需要打印列表中的每个元素,而不是像往常一样打印整个列表来查看它们。 re.findall 返回所有匹配项的列表。
    • 我很感激。很高兴它有帮助:)
    【解决方案2】:

    你也可以不使用正则表达式:

    s = 'python {(P)hello world(P)} java'
    r = s.split('(P)')[1]
    print(r)
    # 'hello world'
    

    【讨论】:

    • {} 的要求怎么样?!您的代码适用于 示例,但无法回答问题
    • 是的,我和@OhadEytan有同样的感觉,投上一票。
    • 感谢摩西的回复和投票,如果你能解决@OhadEytan 提出的问题,那就太好了。
    【解决方案3】:

    您可以使用肯定的环视来确保它仅在文本之前和之后是开始和结束标记时匹配。例如,您可以使用以下模式:

    (?<={\(P\)).*?(?=\(P\)})
    

    请参阅demo

    • (?&lt;={\(P\)) - 后向表达式指出匹配必须以 {(P) 开头。
    • .*? - 匹配开始和结束标签之间的所有文本。 ? 使明星变得懒惰(即不贪婪)。这意味着它将尽可能少地匹配。
    • (?=\(P\)}) - 表示匹配必须后跟 (P)} 的前瞻表达式。

    不管怎样,惰性模式在技术上效率较低,所以如果你知道匹配中不会有 ( 字符,最好使用否定字符类:

    (?<={\(P\))[^(]*(?=\(P\)})
    

    【讨论】:

    • 谢谢史蒂夫,投票。为什么需要以? 开头?
    • 这就是环视的语法。 (?&lt;= ... ) 创建一个积极的后视。 (?= ... ) 创建一个积极的前瞻性。通过使用环视表达式,您可以声明某些事物必须在匹配之前或之后出现,而无需将它们实际包含在匹配中。
    • 酷,谢谢史蒂夫,投票。我发现如果两个(P)之间有ASCII,就可以成功输出。但是如果中间有unicode字符,输出(我用print re.findall(r'(?&lt;={\(P\)).*?(?=\(P\)})', utf-8-string-to-pass)输出)会很奇怪,比如['\xe5\x8e\],有什么想法在使用print输出时将它们转换回unicode字符?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 2017-09-21
    相关资源
    最近更新 更多