【问题标题】:Python regular expression using the OR operator使用 OR 运算符的 Python 正则表达式
【发布时间】:2023-03-10 00:05:01
【问题描述】:

我正在尝试使用正则表达式 (RE) 解析大量文本文件样本。我试图从这些文件中提取包含 'vu' 并以换行符 '\n' 结尾的部分文本。

模式因文件而异,因此我尝试使用 OR 运算符在我的文件中查找 RE 的组合。但是,我没有找到一种方法来自动化我的代码,以便 re.findall() 函数查找 RE 的组合。

这是我尝试解决此问题的示例,但显然我仍然无法同时评估我的正则表达式和 re.findall() 中的 OR 运算符:

import re

def series2string(myserie) :
    myserie2 = ' or '.join(serie for serie in myserie)
    return myserie2

def expression(pattern, mystring) : 
    x = re.findall(pattern, mystring)
    if len(x)>0:
        return 1
    else:
        return 0

#text example
text = "\n\n    (troisième chambre)\n    i - vu la requête, enregistrée le 28 février 1997 sous le n° 97nc00465, présentée pour m. z... farinez, demeurant ... à dommartin-aux-bois (vosges), par me y..., avocat ;\n"

#expressions to look out
pattern1 = '^\s*vu.*\n'
pattern2 = '^\s*\(\w*\s*\w*\)\s*.*?vu.*\n'

pattern = [pattern1, pattern2]
pattern = series2string(pattern)

expression(pattern, text)

注意:我通过在 for 循环 中查找每个模式来规避这个问题,但是如果我可以使用 re.findall( ) 一次。

【问题讨论】:

    标签: python regex or-operator


    【解决方案1】:

    Python 正则表达式使用| 运算符进行交替。

    def series2string(myserie) :
        myserie2 = '|'.join(serie for serie in myserie)
        myserie2 = '(' + myserie2 + ')'
        return myserie2
    

    更多信息:https://docs.python.org/3/library/re.html


    个别模式看起来真的很乱,所以我不知道什么是错误,什么是故意的。我猜你在几个不同的上下文中寻找“vu”这个词。

    1. 始终使用 Python 原始字符串作为正则表达式,前缀为 r (r'pattern here')。它允许您在模式中使用\,而无需 python 尝试将其解释为字符串转义。它直接传递给正则表达式引擎。 (ref)
    2. 使用\s 匹配空格(空格和换行符)。
    3. 由于您已经有多种替代模式,因此不要将( 和) 设为可选。它可能导致灾难性的回溯,这会使匹配大字符串变得非常慢。
      \(? → \(
      \)? → \)
    4. {1} 什么都不做。它只是重复上一个子模式一次,这与不指定任何内容相同。
    5. \br 无效。它被解释为\b(ASCII 钟形字符)+ 字母r。
    6. 文本字符串的开头有一个引号字符 (')。要么您打算 ^ 匹配任何行的开头,要么 ' 是复制/粘贴错误。
    7. 组合模式时的一些错误:

      pattern = [pattern1, pattern2, pattern3, pattern4]
      pattern = series2string(pattern)
      
      expression(re.compile(pattern), text)
      

    【讨论】:

    • 您能否更新您的问题以包含更正后的代码?保留原始代码作为上下文,否则这个答案没有意义。
    • 你想匹配什么?你是怎么得到你的模式的?
    【解决方案2】:

    感谢您的提示。在我的第一篇文章中,我的正则表达式有点笨拙(我改变了它们,希望这个问题更容易理解)。由于're.compile',我设法捕获了 OR 运算符'|',并且代码运行良好!

    import re
    
    def series2string(myserie) :
        myserie2 = '|'.join(serie for serie in myserie)
        return myserie2
    
    def expression(pattern, mystring) : 
        x = re.findall(pattern, mystring)
        if len(x)>0:
            return 1
        else:
            return 0
    
    #text example
    text = "\n\n    (troisième chambre)\n    i - vu la requête, enregistrée le 28 février 1997 sous le n° 97nc00465, présentée pour m. z... farinez, demeurant ... à dommartin-aux-bois (vosges), par me y..., avocat ;\n"
    
    #expressions to look out
    pattern1 = r'^\s*vu.*\n'
    pattern2 = r'^\s*\(\w*\s*\w*\)\s*.*?vu.*\n'
    
    pattern = [pattern1, pattern2]
    pattern = series2string(pattern)
    
    expression(re.compile(pattern), text)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-18
      • 2012-10-30
      • 2011-01-03
      • 1970-01-01
      • 2014-08-24
      • 1970-01-01
      • 2014-05-01
      相关资源
      最近更新 更多