import re
s6 = '''Male : abc
Male : def'''
re.findall(r'(.*):|:(.*)', s6)我的产出:
[('Male ', ''), (' Male ', '')]我的预期产出:
[('Male','abc'),('Male','def')]当我做re.findall(r'(.*):', s6)的时候,我得到了['Male ', ' Male '],和re.findall(r':(.*)', s6),我得到了[' abc', ' def']。当我使用|符号时,我得到了错误的输出。
免责声明:请不要做re.split
我也做了\w+,它正在工作,但是我想要一个如下格式的表达式。我做过re.findall(r'\s*(\w+)\s*:|:\s*(\w+)', s6),它不是单独工作的。有了\s*(\w+)\s*:和:\s*(\w+)', s6,它就可以工作了。
我想知道为什么|不起作用。
发布于 2019-11-09 07:34:08
交替运算符|表示“匹配此正则表达式,否则匹配该正则表达式”。这两个子表达式不可能同时匹配。如果第一个是匹配的,第二个甚至将永远不会被检查。
要从冒号的两边提取内容,只需创建一个正则表达式,该表达式在相同的匹配中捕获两边的文本。
re.findall(r'([^\n:]+):([^\n:]+)', s6)要修剪匹配的空格,您需要一个更复杂的正则表达式,当然,如果您知道匹配的字符串总是一个标记(也就是说,每个字符串都是一个字母字符串,其中没有空格):
re.findall(r'(\w+)\s*:\s*(\w+)', s6)也许对多个令牌来说
re.findall(r'\s*([^\n:]+?)\s*:\s*([^\n:]+?)(?=\s*(?:\n|$))', s6)在这里,我们非常明显地在贪婪和非贪婪的匹配之间交替,以得到尽可能短的字符串,这将仍然满足正则表达式。
或者你可以转过身来,把贪婪变成你的优势:
re.findall(r'(\w+(?:[^\n\S]+\w+)*)\s*:\s*(\w+(?:[^\n\S]+\w+)*)', s6)在这里,只要空格不包含换行符,我们就会尽可能多地捕获空格分隔的标记。
更详细地说,e+匹配尽可能多(贪婪匹配),而e+?匹配尽可能少(非贪婪或吝啬匹配)。(?=...)是一种前瞻性,它需要以下表达式来匹配,而不需要捕获或使用匹配的文本。因此,当e(?=e)应用于文本时,eee将首先匹配初始的e,并且在findall的下一次迭代中立即找到下面的一个,尽管它已经参与了满足以前的匹配。当然,(?:...)是普通的非捕获分组括号,而[^\n\S]是一个字符类,它与任何一个不是换行符的字符和.不是空白类别的成员,所以除了换行符外,任何空白都是有效的。
还请注意,我们如何显式地避免在捕获表达式中匹配冒号或换行符。
新手:“我怎样才能匹配所有这些字符串?”
师父:“我怎样才能与这些字符串相匹配?”
发布于 2019-11-09 07:34:53
它不能工作,因为第一个匹配消耗了您的锚(冒号),所以第二个匹配永远不匹配。您需要断言来解决这个问题,但是这种情况太复杂了:
import re
compiled = re.compile(r'((\w+)\s*(?=:)|(?<=:)\s*(\w+))')
s6 = '''Male : abc
Male : def'''
re.findall(compiled, s6)
# Output:
[('Male ', 'Male', ''),
(' abc', '', 'abc'),
('Male ', 'Male', ''),
(' def', '', 'def')]因此,现在您需要对列表进行后置处理,考虑到此输入,不建议这样做。简而言之:两种情况下不要使用一个锚。
发布于 2019-11-09 07:13:58
如果您需要所有的单词,只需使用'\w+'
s6 = '''Male : abc
Male : def'''
re.findall('\w+', s6)输出:
['Male', 'abc', 'Male', 'def']https://stackoverflow.com/questions/58777220
复制相似问题