【问题标题】:Python regex to parse '@####' text in description field [duplicate]Python正则表达式解析描述字段中的'@####'文本[重复]
【发布时间】:2019-08-03 17:14:57
【问题描述】:

这是我要解析的行:

@abc def@gmail.com @ghi j@klm @nop.qrs @tuv

这是我目前得到的正则表达式:

@[A-Za-z]+[^0-9. ]+\b | @[A-Za-z]+[^0-9. ]

我的目标是得到 ['@abc', '@ghi', '@tuv'],但无论我做什么,我都无法让 'j@klm' 不匹配。非常感谢任何帮助。

【问题讨论】:

    标签: regex python-3.x


    【解决方案1】:

    尝试将re.findall 与以下正则表达式模式一起使用:

    (?:(?<=^)|(?<=\s))@[A-Za-z]+(?=\s|$)
    
    inp = "@abc def@gmail.com @ghi j@klm @nop.qrs @tuv"
    matches = re.findall(r'(?:(?<=^)|(?<=\s))@[A-Za-z]+(?=\s|$)', inp)
    print(matches)
    

    打印出来:

    ['@abc', '@ghi', '@tuv']
    

    正则表达式需要解释。 (?:(?&lt;=^)|(?&lt;=\s)) 的前导后视断言 @ 符号之前的内容要么是空格,要么是字符串的开头。我们不能在这里使用单词边界,因为@ 不是单词字符。我们在模式末尾使用类似的前瞻(?=\s|$) 来排除匹配@nop.qrs 之类的内容。同样,仅靠单词边界是不够的。

    【讨论】:

    • 这就像一个魅力,解释是一个很大的奖励。谢谢!
    【解决方案2】:

    只需在开头添加行起始匹配:

    ^@[A-Za-z]+[^0-9. ]+\b | @[A-Za-z]+[^0-9. ]
    

    它应该工作!

    【讨论】:

    • 不幸的是,当我运行它时,我得到:['@abc','@ghi','@nop','@tuv']
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 2016-09-28
    • 1970-01-01
    相关资源
    最近更新 更多