这可能是一个愚蠢的问题,但......
假设您有一句话:
快速的棕色狐狸
或者你可能会得到一句话:
快速的棕色狐狸跳过懒狗
简单的正则表达式(\ w *)找到第一个单词“The”并将其放在一个组中。
对于第一句话,你可以写(\ w *)\ s *(\ w *)\ s *(\ w *)\ s *(\ w *)\ s *将每个单词放在自己的单词中小组,但假设你知道句子中的单词数量。
是否可以编写一个正则表达式,将任意句子中的每个单词放入其自己的组中?如果你能做一些类似(?:( \ w *)\ s *)*的东西,让它对(\ w *)的每个实例进行分组,那会很好。但是这不起作用。
我在Python中这样做,我的用例显然比“快速棕狐”复杂一点,所以如果Regex可以在一行中做到这一点会很好,但是如果那不可能那么我就假设下一个最佳解决方案是使用re.findall()或类似的东西遍历所有匹配。
感谢您的任何见解。
编辑:为了完整起见,这是我的实际用例以及我如何使用您的帮助解决它。再次感谢。
>>> s = '1 0 5 test1 5 test2 5 test3 5 test4 5 test5'
>>> s = re.match(r'^\d+\s\d+\s?(.*)', s).group(1)
>>> print s
5 test1 5 test2 5 test3 5 test4 5 test5
>>> list = re.findall(r'\d+\s(\w+)', s)
>>> print list
['test1', 'test2', 'test3', 'test4', 'test5']
答案 0 :(得分:6)
您还可以在模块重新使用函数findall
import re
>>> re.findall("\w+", "The quick brown fox")
['The', 'quick', 'brown', 'fox']
答案 1 :(得分:5)
我不相信这是可能的。正则表达式将捕获与给定正则表达式中的括号配对...如果您只列出一个组,如'((\ w +)\ s +){0,99}',那么它将重复捕获到相同的第一个和第二组......没有为每个匹配创建新组。
你可以使用split,但只能拆分一个字符值,而不是像空白一样的字符类。
相反,你可以使用re.split,它可以在正则表达式上拆分,并给它'\ s'来匹配任何空格。您可能希望它匹配'\ s +'以贪婪地收集空白。
>>> import re
>>> help(re.split)
Help on function split in module re:
split(pattern, string, maxsplit=0)
Split the source string by the occurrences of the pattern,
returning a list containing the resulting substrings.
>>> re.split('\s+', 'The quick brown\t fox')
['The', 'quick', 'brown', 'fox']
>>>
答案 2 :(得分:3)
为什么在string.split
执行相同操作时使用正则表达式?
>>> "The quick brown fox".split()
['The', 'quick', 'brown', 'fox']
答案 3 :(得分:1)
正则表达式无法分组到未知数量的组中。但你的情况有希望。查看“拆分”方法,它应该对您的情况有所帮助。