使用OR操作的Python正则表达式

2024-09-30 03:23:55 发布

您现在位置:Python中文网/ 问答频道 /正文

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

模式因文件而异,因此我尝试使用运算符在文件中查找RE的组合。但是,我没有找到自动化代码的方法,因此关于芬德尔()函数查找RE的组合。在

下面是一个例子,说明我如何解决这个问题,但显然我仍然无法同时计算正则表达式和中的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循环中查找每个模式来避免这个问题,但是如果我可以使用关于芬德尔()一次。在


Tags: 文件textreforreturndef模式运算符
2条回答

谢谢你的建议。在我的第一篇文章中,我的正则表达式有点笨拙(我改变了它们,希望问题更容易理解)。由于“re.compile”,我成功地捕获了运算符“|”,代码运行良好!在

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)

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原始字符串,前缀为rr'pattern here')。它允许您在模式中使用\,而无需python尝试将其解释为字符串转义。它直接传递给regex引擎。(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)
    

相关问题 更多 >

    热门问题