当前位置: 首页 > 知识库问答 >
问题:

使用OR运算符的Python正则表达式[重复]

华甫
2023-03-14

我试图用正则表达式(RE)解析一个大样本的文本文件。我正在尝试从这些文件中提取包含< i>'vu'并以换行符结束的文本部分。

模式因文件而异,因此我尝试使用 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() 一次,我的代码会运行得更快。

共有2个答案

程瑞
2023-03-14

谢谢你的建议。我的正则表达式在我的第一篇文章中有点笨拙(我改变了它们,希望问题能更容易理解)。我设法捕获了OR运算符'|',感谢'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)
冯文彬
2023-03-14

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

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

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

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

>

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

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

  •  类似资料:
    • 问题内容: 这可能是一个愚蠢的问题,但我在任何地方都找不到: 如何在不带括号的情况下使用Java OR正则表达式运算符(|)? 例如:电话|电话|传真 问题答案: 您可以单独使用管道: 例如: 输出: 使用括号的主要原因是要限制替代方法的范围: 具有相同的输出。但是,如果您只是这样做: 你得到: 因为您说过“ string1”或“ 2”。 如果您不想捕获表达式的那一部分,请使用:

    • 问题内容: 正则表达式中是否存在NOT运算符?就像在那个字符串中一样: 我想删除所有但不是一年的:。 因此,正则表达式应返回的内容必须是:。 注意:类似的东西对我不起作用(某种程度上也匹配…) 问题答案: 不,没有直接的非运算符。至少不是您希望的方式。 您可以使用零宽度的负前瞻,但是: 该部分的意思是“仅在 以下 文本(因此:前瞻)与此(因此:否定) 不 匹配时才匹配。但是它实际上并不会 消耗 其

    • let formulaStr = ""; formulaStr这个是带数字符号的字符串 正则表达式无法满足 加减乘除小括号嵌套使用,该表达式只能满足单层小括号 百度搜索很多无法满足

    • 我正在使用php的。 基本上我有2个字符串匹配的可能性: 你好,现实世界 以下是我希望完成的: 你好 规则说明:如果字符串包含空格,则插入

    • 正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。 相同优先级的从左到右进行运算,不同优先级的运算先高后低。下表从最高到最低说明了各种正则表达式运算符的优先级顺序: 运算符 描述 \ 转义符 (), (?:), (?=), [] 圆括号和方括号 *, +, ?, {n}, {n,}, {n,m} 限定符 ^, $, \任何元字符、任何字符 定位点和序列(即:位置和顺序) | 替

    • 本文向大家介绍Java正则表达式逻辑运算符,包括了Java正则表达式逻辑运算符的使用技巧和注意事项,需要的朋友参考一下 Java正则表达式支持3个逻辑运算符,它们是- XY:X,然后是Y X | Y:X或Y (X):捕获组。 XY:X,然后是Y 这仅匹配两个连续的单个字符。 示例 输出1 输出2 X | Y 这匹配“ |”周围的两个表达式/字符中的任何一个 示例 输出结果 (X):捕获组 捕获组使