【问题标题】:How to exclude a character from a regex group?如何从正则表达式组中排除字符?
【发布时间】:2011-05-05 17:54:29
【问题描述】:

我想从字符串 (python) 中删除除连字符之外的所有非字母数字字符。 如何更改此正则表达式以匹配除连字符以外的任何非字母数字字符?

re.compile('[\W_]')

谢谢。

【问题讨论】:

    标签: python regex


    【解决方案1】:

    您可以只使用否定字符类:

    re.compile(r"[^a-zA-Z0-9-]")
    

    这将匹配不在字母数字范围或连字符中的任何内容。根据您当前的正则表达式,它还匹配下划线。

    >>> r = re.compile(r"[^a-zA-Z0-9-]")
    >>> s = "some#%te_xt&with--##%--5 hy-phens  *#"
    >>> r.sub("",s)
    'sometextwith----5hy-phens'
    

    请注意,这也会替换空格(这肯定是您想要的)。


    编辑: SilentGhost 建议使用量词处理引擎可能会更便宜,在这种情况下,您可以简单地使用:

    re.compile(r"[^a-zA-Z0-9-]+")
    

    + 将简单地导致任何连续匹配的字符同时匹配(并被替换)。

    【讨论】:

    • +1 你是对的,删除了我的答案,因为你的封面我认为他想要什么......匹配任何字符,而不是数字、字母或连字符。
    • 量词会让这个更便宜。
    • @SilentGhost:引擎便宜吗?我假设您是指表演时间。
    • @eldarerathis: 更换 10 件还是 3 件更便宜?当然,项目的实际数量将取决于主题。
    • @SilentGhost:更换成本更低,但匹配成本更高(很可能,因为引擎将在每次运行结束时进行匹配然后回溯)。尽管替换似乎是这两种操作中成本更高的一种,但总体而言您可能是对的。
    【解决方案2】:

    \w 匹配字母数字,添加连字符,然后否定整个集合:r"[^\w-]"

    【讨论】:

    • 我假设下划线被认为是非字母数字;)
    • 这不会匹配/替换 OP 当前正则表达式所做的下划线字符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 2014-04-15
    • 2021-12-08
    • 2021-09-16
    • 1970-01-01
    相关资源
    最近更新 更多