python regex:捕获包含空格的多个字符串的部分

ssc*_*ssc 0 python regex space repeat

我试图从类似于的字符串中捕获子字符串

'some string, another string, '
Run Code Online (Sandbox Code Playgroud)

我想要结果匹配组

('some string', 'another string')
Run Code Online (Sandbox Code Playgroud)

我目前的解决方案

>>> from re import match
>>> match(2 * '(.*?), ', 'some string, another string, ').groups()
('some string', 'another string')
Run Code Online (Sandbox Code Playgroud)

虽然工作,但不切实际 - 我在这里展示的当然是复杂程度与我在实际项目中所做的相比大大减少了; 我想只使用一个'直的'(非计算)正则表达式模式.不幸的是,到目前为止我的尝试失败了:

这不匹配(结果为None),因为{2}仅应用于空间,而不是整个字符串:

>>> match('.*?, {2}', 'some string, another string, ')
Run Code Online (Sandbox Code Playgroud)

在重复的字符串周围添加括号在结果中有逗号和空格

>>> match('(.*?, ){2}', 'some string, another string, ').groups()
('another string, ',)
Run Code Online (Sandbox Code Playgroud)

添加另一组parantheses确实解决了这个问题,但是让我太过分了:

>>> match('((.*?), ){2}', 'some string, another string, ').groups()
('another string, ', 'another string')
Run Code Online (Sandbox Code Playgroud)

添加非捕获修饰符可以改善结果,但仍会错过第一个字符串

>>> match('(?:(.*?), ){2}', 'some string, another string, ').groups()
('another string',)
Run Code Online (Sandbox Code Playgroud)

我觉得我很亲密,但我似乎无法找到正确的方法.

谁能帮我 ?我还没有看到任何其他方法?


在前几个回复后更新:

首先,非常感谢大家,非常感谢您的帮助!:-)

正如我在原帖中所说,为了描述实际的核心问题,我在我的问题中省略了很多复杂性.对于初学者来说,在我正在研究的项目中,我正在解析大量文件(目前每天数万个),这些文件在不同的基于行的格式的数字(目前为5,很快~25,可能在数百之后)中.还有XML,JSON,二进制和一些其他数据文件格式,但让我们保持专注.

为了应对多种文件格式并利用其中许多是基于行的事实,我创建了一个有点通用的Python模块,它将一个文件加载到另一个文件后,将regex应用于每一行并返回一个大的匹配的数据结构.这个模块是一个原型,生产版本需要一个C++版本的性能原因,它将通过Boost :: Python连接,并可能将正则表达式方言的主题添加到复杂性列表中.

此外,没有2次重复,但是在当前零和70(左右)之间变化的量,逗号并不总是逗号,尽管我最初说过,正则表达式的某些部分必须在运行时计算; 让我们说我有理由尝试减少"动态"数量并尽可能多地采用"固定"模式.

所以,总之:我必须使用正则表达式.


尝试重新措辞:我认为问题的核心归结为:是否存在Python RegEx表示法,例如涉及花括号重复并允许我捕获

'some string, another string, '
Run Code Online (Sandbox Code Playgroud)

('some string', 'another string')
Run Code Online (Sandbox Code Playgroud)

嗯,这可能会把它缩小得太远 - 但是,你做的任何方式都是错的:-D


第二次尝试重新措辞:为什么我在结果中看不到第一个字符串('some string')?为什么正则表达式产生匹配(表示必须有2个),但只返回1个字符串(第二个)?

即使我使用非数字重复,即使用+而不是{2},问题仍然存在:

>>> match('(?:(.*?), )+', 'some string, another string, ').groups()
('another string',)
Run Code Online (Sandbox Code Playgroud)

此外,它不是返回的第二个字符串,它是最后一个:

>>> match('(?:(.*?), )+', 'some string, another string, third string, ').groups()
('third string',)
Run Code Online (Sandbox Code Playgroud)

再次感谢您的帮助,在尝试找出我真正想知道的内容时,永远不会让我惊讶于同行评审是多么有用...

sen*_*rle 5

除非你解释这个问题还有更多,否则我没有看到使用正则表达式的重点.这是非常简单的处理使用基本字符串的方法:

[s.strip() for s in mys.split(',') if s.strip()]
Run Code Online (Sandbox Code Playgroud)

或者如果它必须是一个元组:

tuple(s.strip() for s in mys.split(',') if s.strip())
Run Code Online (Sandbox Code Playgroud)

代码也更具可读性.请告诉我这是否适用.


编辑:好的,这个问题确实比最初看起来更多.但是出于历史目的而留下这个.(猜猜我不是'纪律':))