这似乎是一个相当简单的问题,但我无法让它发挥作用。
我有一个文本文件,其中包含类似 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/