首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >怎么才能和?

怎么才能和?
EN

Stack Overflow用户
提问于 2019-11-09 07:12:40
回答 5查看 190关注 0票数 3
代码语言:javascript
复制
import re
s6 = '''Male : abc
   Male : def'''
re.findall(r'(.*):|:(.*)', s6)

我的产出:

代码语言:javascript
复制
[('Male ', ''), ('            Male ', '')]

我的预期产出:

代码语言:javascript
复制
[('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,它就可以工作了。

我想知道为什么|不起作用。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2019-11-09 07:34:08

交替运算符|表示“匹配此正则表达式,否则匹配该正则表达式”。这两个子表达式不可能同时匹配。如果第一个是匹配的,第二个甚至将永远不会被检查。

要从冒号的两边提取内容,只需创建一个正则表达式,该表达式在相同的匹配中捕获两边的文本。

代码语言:javascript
复制
re.findall(r'([^\n:]+):([^\n:]+)', s6)

要修剪匹配的空格,您需要一个更复杂的正则表达式,当然,如果您知道匹配的字符串总是一个标记(也就是说,每个字符串都是一个字母字符串,其中没有空格):

代码语言:javascript
复制
re.findall(r'(\w+)\s*:\s*(\w+)', s6)

也许对多个令牌来说

代码语言:javascript
复制
re.findall(r'\s*([^\n:]+?)\s*:\s*([^\n:]+?)(?=\s*(?:\n|$))', s6)

在这里,我们非常明显地在贪婪和非贪婪的匹配之间交替,以得到尽可能短的字符串,这将仍然满足正则表达式。

或者你可以转过身来,把贪婪变成你的优势:

代码语言:javascript
复制
re.findall(r'(\w+(?:[^\n\S]+\w+)*)\s*:\s*(\w+(?:[^\n\S]+\w+)*)', s6)

在这里,只要空格不包含换行符,我们就会尽可能多地捕获空格分隔的标记。

更详细地说,e+匹配尽可能多(贪婪匹配),而e+?匹配尽可能少(非贪婪或吝啬匹配)。(?=...)是一种前瞻性,它需要以下表达式来匹配,而不需要捕获或使用匹配的文本。因此,当e(?=e)应用于文本时,eee将首先匹配初始的e,并且在findall的下一次迭代中立即找到下面的一个,尽管它已经参与了满足以前的匹配。当然,(?:...)是普通的非捕获分组括号,而[^\n\S]是一个字符类,它与任何一个不是换行符的字符和.不是空白类别的成员,所以除了换行符外,任何空白都是有效的。

还请注意,我们如何显式地避免在捕获表达式中匹配冒号或换行符。

新手:“我怎样才能匹配所有这些字符串?”

师父:“我怎样才能与这些字符串相匹配?”

票数 4
EN

Stack Overflow用户

发布于 2019-11-09 07:34:53

它不能工作,因为第一个匹配消耗了您的锚(冒号),所以第二个匹配永远不匹配。您需要断言来解决这个问题,但是这种情况太复杂了:

代码语言:javascript
复制
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')]

因此,现在您需要对列表进行后置处理,考虑到此输入,不建议这样做。简而言之:两种情况下不要使用一个锚。

票数 2
EN

Stack Overflow用户

发布于 2019-11-09 07:13:58

如果您需要所有的单词,只需使用'\w+'

代码语言:javascript
复制
s6 = '''Male : abc
   Male : def'''
re.findall('\w+', s6)

输出:

代码语言:javascript
复制
['Male', 'abc', 'Male', 'def']
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58777220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档