【发布时间】:2016-08-19 09:11:06
【问题描述】:
我有这个正则表达式:^:([^:]+):([^:]*),它在 this regex101 link 中工作。
现在,在 Python 中,我有这个:
def get_data():
data = read_mt_file()
match_fields = re.compile('^:([^:]+):([^:]*)', re.MULTILINE)
fields = re.findall(match_fields, data)
return fields
对于包含来自 regex101 的数据的文件,返回:
[('1', 'text\ntext\n\n'), ('20', 'text\n\n'), ('21', 'text\ntext\ntext\n\n'), ('22', ' \n\n'), ('25', 'aa\naa\naaaaa')]
现在,这没关系,但我想更改正则表达式,以便我可以让组数根据行数而变化。含义:
- 对于第一行,现在我得到了两组:
1text\ntext\n\n
我想改为:
1- ((
text\n), (text\n\n)) 子组中。不知何故,我需要知道它们都属于1字段,但是是单独的行。
因此,在 python 中,该文件的期望结果是:
[('1', '(text\n), (text\n\n)'), ('20', 'text\n\n'), ('21', '(text\n), (text\n), (text\n\n)'), ('22', ' \n\n'), ('25', '(aa\n), (aa\n), (aaaaa)')]
这可以用正则表达式吗?这可以通过一些不错的字符串操作来实现吗?
【问题讨论】:
-
您不能让正则表达式返回可变数量的组。您可以执行
((\w*)(?:\s(\w+))?)之类的操作将文本拆分为第 3 组和第 4 组,但更好的解决方案是使用您拥有的正则表达式,然后使用(?<=\n)(?=\w)之类的内容拆分第 2 组的内容。 -
使用
re正则表达式,您可能会得到块,但是您需要对结果执行额外的操作。使用 PyPi 正则表达式模块,您可以通过访问重复捕获通过 1 个正则表达式操作来获得它。 -
@WiktorStribiżew 我是否必须对结果执行其他额外操作并不重要,只要它们更接近我需要的结果:P
-
检查ideone.com/hO7SyM - 也许这就是你需要的?结果是一个列表列表 -
[['1', 'text\n', 'text\n\n'], ['20', 'text\n\n'], ['21', 'text\n', 'text\n', 'text\n\n'], ['22', ' \n\n'], ['25', 'aa\n', 'aa\n', 'aaaaa']] -
或
print([(x, "({})".format(re.sub(r".+(?!\n*$)\n+", r"\g<0>), (", y))) for x, y in p.findall(s)])- ideone.com/DPP9mq
标签: python regex python-3.x split