【问题标题】:Python Regex to find everything within parenthesis, with a prefix beforehandPython 正则表达式查找括号内的所有内容,事先带有前缀
【发布时间】:2021-12-21 12:18:48
【问题描述】:

这似乎是一个相当简单的问题,但我无法让它工作。

我有一个文本文件,其中包含类似 JSON 的数据,但还有几行额外的行,阻止它成为有效的 JSON,我需要删除这些。这听起来很简单,甚至更简单,因为有效的 JSON 字符串(我可以稍后解析)总是包含在以下容器中:

xyz()

因此,例如,数据集将类似于:

abcdefg
xyz({"id_value": 123, "text_value": "efg"})

abcdefg
xyz({"id_value": 124, "text_value": "hij"})

每个单独的 JSON 字符串总是以 abcdefg 为前缀,然后是 xyz( 并且后面总是有一个右括号。所以格式是一致的。

我正在尝试以下方法:

re.findall(r'xyz\(.*?\)', text_file)

然而,尽管尝试了这种变化(例如,使用 re.search、尝试 \w+ 等),但似乎没有任何效果(我的意思是它返回一个空列表)。

如果我只是尝试执行以下操作:

re.findall(r'xyz\(

然后它返回:

['xyz(', 'xyz(']

正如预期的那样。

所以问题似乎出在括号中的字符串上,但我无法弄清楚问题出在哪里,因为这里的其他示例表明我的代码是正确的(它不可能是因为它不起作用)!

我认为它非常简单,但我有点卡住了!

【问题讨论】:

  • 当 text_file 是本地定义的字符串时,re.findall(r'xyz\((.*?)\)', text_file) 对我有用。在你的情况下 text_file 是什么?
  • 也适合我。
  • 这是令人沮丧的部分!这是我无法在此处复制的情况之一(我不允许发布实际文件),但结构与上述相同,因此没有意义(为避免怀疑,该文件是本地文本文件)!
  • 你可能想要import regex(在pip install regex之后)然后是[x.group() for x in regex.finditer(r'xyz(\((?:[^()]++|(?1))*\))', text_file)
  • 确实有效,非常感谢!

标签: python regex re


【解决方案1】:

您可以通过运行pip install regex(或pip3 install regex)安装PyPi regex 模块,然后使用此库匹配xyz( 和下一个配对) 字符之间的字符串:

import regex 
#...
output = [x.group() for x in regex.finditer(r'xyz(\((?:[^()]++|(?1))*\))', text_file)

列表解析用于避免regex.findall 的问题,当在正则表达式中定义捕获组时仅返回捕获的子字符串(这里,括号周围的捕获组是必需的,因为它在模式内递归(?1) 子程序。

图案细节

  • xyz - xyz 文字
  • (\((?:[^()]++|(?1))*\)) - 第 1 组:
    • \( - 一个 ( 字符
    • (?:[^()]++|(?1))* - 除了 () 或子例程重复(递归)整个第 1 组模式之外,一个或多个字符的零次或多次重复
    • \) - ) 字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    相关资源
    最近更新 更多