正则表达式匹配除复合词连字符以外的非Alpha字符

2024-06-16 09:04:01 发布

您现在位置:Python中文网/ 问答频道 /正文

Python3.6的正则表达式。我试图删除非字母字符,但我想不匹配复合词中的连字符。这是我的模式:

[^\sA-Za-z\u00C0-\u00FF\u0153\u0152-]|(?=\W)-(?<=\W)

例如,对于- word-word,我想匹配第一个,但不是第二个,但是我的模式两者都匹配。你知道吗


Tags: 字母sa模式字符wordza复合词u0153
1条回答
网友
1楼 · 发布于 2024-06-16 09:04:01

在Python3.6中,您可以使用一种技术来匹配和捕获您需要保留的内容(字母之间的-可以与[^\W\d_]-(?=[^\W\d_])匹配),并且只匹配您需要删除的内容(所有非字母数字或您定义的任何字符)。你知道吗

因此,示例re.sub如下所示

re.sub(r'([^\W\d_]-)(?=[^\W\d_])|[^\sA-Za-z\u00C0-\u00FF\u0153\u0152]', r'\1', s)

或者

re.sub(r'([^\W\d_]-)(?=[^\W\d_])|(?:[^\w\s]|_)', r'\1', s)

在哪里

  • ([^\W\d_]-)(?=[^\W\d_])-任意字母和-后跟任意字母(允许连续匹配是正向的,如a-b-c
  • |-或
  • (?:[^\w\s]|_)-匹配任何单个非单词和非空白字符或_。你知道吗

r'\1'是一个替换的backreference,一个占位符,它引用组1中的内容,并将其插入到结果字符串中。你知道吗

参见regex demo。你知道吗

在3.5之前的Python版本中,需要使用lambda作为替换参数来检查组1是否匹配:

re.sub(r'([^\W\d_]-)(?=[^\W\d_])|(?:[^\w\s]|_)', lambda x: x.group(1) if x.group(1) else '', s)

另一个可能的解决办法是

re.sub(r'(?!\b-\b)(?:[^\w\s]|_)', '', s)

参见regex demo。在这里,由于使用了\b单词边界,用单词字符括起来的-将不会匹配(但即使用下划线括起来,也会避免匹配-)。你知道吗

相关问题 更多 >