我试图从一个类似于'some string, another string, '
我希望结果匹配组
^{pr2}$
我当前的解决方案>>> from re import match
>>> match(2 * '(.*?), ', 'some string, another string, ').groups()
('some string', 'another string')
有效,但不可行-我在这里展示的内容当然比我在实际项目中所做的要复杂得多;我只想使用一种“直接”(非计算)regex模式。不幸的是,到目前为止,我的尝试失败了:
这不匹配(结果为None),因为{2}只应用于空间,而不是应用于整个字符串:>>> match('.*?, {2}', 'some string, another string, ')
在重复的字符串周围加上括号,结果中有逗号和空格>>> match('(.*?, ){2}', 'some string, another string, ').groups()
('another string, ',)
再加上一套疑神疑鬼确实解决了这个问题,但我觉得太多了:>>> match('((.*?), ){2}', 'some string, another string, ').groups()
('another string, ', 'another string')
添加一个非捕获修饰符可以改善结果,但仍然缺少第一个字符串>>> match('(?:(.*?), ){2}', 'some string, another string, ').groups()
('another string',)
我觉得我很亲近,但我似乎真的找不到合适的方法。在
有人能帮我吗?还有其他我没看到的方法吗?在
在前几个回复后更新:
首先,非常感谢大家,非常感谢你们的帮助!:-)
正如我在原帖中所说,为了描述实际的核心问题,我在我的问题中省略了很多复杂性。对于初学者来说,在我正在工作的项目中,我正在解析大量的文件(目前每天数万个),这些文件是以不同的基于行的格式(目前是5个,很快就有25个,以后可能会有数百个)。还有XML、JSON、binary和其他一些数据文件格式,但我们还是集中讨论。在
为了处理多种文件格式,并利用其中许多格式都是基于行的这一事实,我创建了一个有点通用性的Python模块,该模块一个接一个地加载一个文件,对每一行应用一个正则表达式,并返回一个包含匹配项的大数据结构。该模块是一个原型,生产版本将需要一个C++版本来执行性能,它将在Boosi::Python上连接,并且可能将ReGEX方言的主题添加到复杂列表中。在
而且,没有2次重复,但是数量在当前的0到70之间变化(大约),逗号并不总是逗号,尽管我最初说过,regex模式的某些部分必须在运行时计算;假设我有理由减少“动态”数量,并尽可能多地使用“固定”模式。在
所以,总而言之:我必须使用正则表达式。
尝试重新措辞:我认为问题的核心可以归结为:是否有一种Python RegEx表示法,例如,包含大括号重复,并允许我捕获'some string, another string, '
进入
^{pr2}$
是吗?在
嗯,这可能会把范围缩小得太小了-但是,不管怎样,你都是错的
第二次尝试重新措辞:为什么在结果中没有看到第一个字符串('some string')?为什么正则表达式生成一个匹配项(表示必须有2个)而只返回1个字符串(第二个字符串)?在
即使我使用非数字重复,即使用+而不是{2},问题仍然相同:>>> match('(?:(.*?), )+', 'some string, another string, ').groups()
('another string',)
此外,返回的不是第二个字符串,而是最后一个字符串:>>> match('(?:(.*?), )+', 'some string, another string, third string, ').groups()
('third string',)
再次感谢你的帮助,当我试图找出我真正想知道的东西时,同行评议是多么有帮助。。。在