Python正则表达式查找括号内的所有内容,并预先加上前缀

标签 python regex python-re

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

我有一个文本文件,其中包含类似 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(']

正如预期的那样。

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

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

最佳答案

您可以通过运行 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 组:
    • \( - 一个 ( char
    • (?:[^()]++|(?1))* - 除 ( 之外的一个或多个字符零次或多次重复>) 或子例程重复(递归)整个第 1 组模式
    • \) - 一个 ) 字符。

关于Python正则表达式查找括号内的所有内容,并预先加上前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69887200/

相关文章:

python - 对于 Python 3.x 整数,比位移快两倍?

python - 如何针对经典控制问题实现近端策略优化(PPO)算法?

python - 在 Django 中使用 Python 解析 JSON 文件

python - strip 更新订阅python

php - 在 PHP 中使用正则表达式验证电子邮件

android - 没有符号编辑框的货币输入

regex - 在 Shell 中使用 SED 查找和替换 HTML 标签

regex - 从文本中提取 linkedin 用户名的模式

python - 如何在 python 中使用正则表达式替换字符串的多个单词?