【问题标题】:Python regex to match punctuation at end of stringPython正则表达式匹配字符串末尾的标点符号
【发布时间】:2017-09-30 21:41:11
【问题描述】:

如果一个句子在 Python 中以大写开头并以 [?.!] 结尾,我需要匹配。

EDIT它必须有 [?.!] only 在结尾但允许句子中的其他标点符号

import re
s = ['This sentence is correct.','This sentence is not correct', 'Something is !wrong! here.','"This is an example of *correct* sentence."']

# What I tried so for is:
for i in s:
    print(re.match('^[A-Z][?.!]$', i) is not None)

它不起作用,经过一些更改我知道^[A-Z] 部分是正确的,但匹配末尾的标点符号不正确。

【问题讨论】:

    标签: python regex python-3.x match


    【解决方案1】:

    我让它为自己工作,只是为了澄清,或者如果其他人有同样的问题,这就是我的诀窍:

    re.match('^[A-Z][^?!.]*[?.!]$', sentence) is not None
    

    解释: ^[A-Z] 在哪里开始寻找大写字母

    '[^?!.]*' 表示 start 和 end 之间的一切都可以,除了包含 ?!. 的东西

    [?.!]$ 必须以 ?!. 结尾

    【讨论】:

    • 使用负前瞻后跟. 是一种复杂且可能效率低下的实现方式。考虑使用否定字符类:[^?!.]*
    【解决方案2】:

    使用下面的正则表达式。

    ^[A-Z][\w\s]+[?.!]$
    

    正则表达式演示:https://regex101.com/r/jpqTQ0/2


    import re
    s = ['This sentence is correct.','this sentence does not start with capital','This sentence is not correct']
    
    # What I tried so for is:
    for i in s:
        print(re.match('^[A-Z][\w\s]+[?.!]$', i) is not None)
    

    输出:

    True
    False
    False
    

    Working code demo

    【讨论】:

    • 如果我不想让 [?.!] 出现在字符串中的任何其他位置,但只出现在末尾。
    • 那么上面的正则表达式也可以正常工作。检查正则表达式演示链接并在那里尝试您的测试字符串。
    • 但它不允许使用 "," 或 ";"或句子中的引号。
    • @lenz 是的,这就是为什么我自己发布了一个 awnser 并更新了问题。
    【解决方案3】:

    您的正则表达式检查[A-Z] 范围内的单个数字。您应该更改为:

    ^[A-Z].*[?.!]$
    

    .* 更改为您想在字符串末尾的大写字母和标点符号之间匹配的任何内容。

    【讨论】:

    • .* 必须始终避免。
    猜你喜欢
    • 2015-01-01
    • 2019-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 2010-11-23
    • 1970-01-01
    相关资源
    最近更新 更多