【问题标题】:re.findall not outputting group rightre.findall 没有正确输出组
【发布时间】:2018-03-25 17:43:04
【问题描述】:

我试图在字符串中获取单词“does”之后的所有文本..但我只得到单词“does”之后的第一个字母..

string=str("does he like") 
A=re.findall(r'^does\s([\w+\s+])',string ,re.IGNORECASE)
for tuple in A:
    print tuple[0]

该代码的输出只是给出“h”,但我想要“他喜欢”。谁能看到我的代码有什么问题?可能有更简单的方法,但我想使用 re.findall 东西。我对 python 和在这个网站上发帖有点陌生.. 所以放轻松我.. 谢谢????

哦,顺便说一下,这是 python 2.7..

【问题讨论】:

  • 字符类中的+ 匹配文字+。你想使用r'^does\s([\w\s]+)'

标签: regex python-2.7


【解决方案1】:

试试这个。这将捕获整个字符串,但使用 group(1),即您使用 tuple[0] 并抓取“does”之后的每个单词。

A = re.findall(r'^does (.*)', string ,re.IGNORECASE)

希望这会有所帮助!

【讨论】:

  • 显式优于隐式,我建议使用\s 来表示空格。
  • OP 使用的是findall,它返回一个字符串或一个元组,而不是一个match 对象。
【解决方案2】:

你可以试试这个:

r'(?<=does\s)([\w\s-]+)'

Trial #1 at regex101

匹配does之后的所有字母、破折号、空格和数字,直到像?.这样的特殊字符

如果您想要在 does 之后的所有内容,请使用:

r'(?<=does\s)(.+)'

Trial #2 at regex101

正则表达式 -

(?&lt;=does\s) 是一个积极的后视,确保匹配前面有“does”和一个空格。

[\w\s-]+ 匹配一个或多个字母、数字、空格或破折号。

Here's a full summary of the above regexes.

【讨论】:

  • OP 使用的是findall,所以只把你想要捕获的东西放在一个组中。
  • @tdelaney 你能详细说明一下吗?我尝试将 findall 与我的正则表达式一起使用,它可以正确执行。
【解决方案3】:

你有两个问题。第一个是[] 匹配给定组中的单个字符。您要求一个单词、空格或加号。第二个是当你只有一个捕获组时,findall 返回一个字符串,而不是一个元组。将加号移出字符组,直接使用匹配的字符串。

import re

string=str("does he like") 
A=re.findall(r'^does\s([\w\s]+)',string ,re.IGNORECASE)
for foo in A:
    print foo

【讨论】:

    【解决方案4】:

    试试这个:

    import re
    s = "does he like"
    p = re.compile(r"[^does(n't)?].+")
    print(''.join(p.findall(s, re.IGNORECASE)))
    

    或者这个,如果你想要he likes:

    r'\s.+'
    

    【讨论】:

    • r'^does.+' 匹配 "doesn't"
    • 编辑了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    相关资源
    最近更新 更多