2024-06-16 09:04:01 发布
网友
Python3.6的正则表达式。我试图删除非字母字符,但我想不匹配复合词中的连字符。这是我的模式:
[^\sA-Za-z\u00C0-\u00FF\u0153\u0152-]|(?=\W)-(?<=\W)
例如,对于- word-word,我想匹配第一个,但不是第二个,但是我的模式两者都匹配。你知道吗
- word-word
在Python3.6中,您可以使用一种技术来匹配和捕获您需要保留的内容(字母之间的-可以与[^\W\d_]-(?=[^\W\d_])匹配),并且只匹配您需要删除的内容(所有非字母数字或您定义的任何字符)。你知道吗
-
[^\W\d_]-(?=[^\W\d_])
因此,示例re.sub如下所示
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中的内容,并将其插入到结果字符串中。你知道吗
r'\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单词边界,用单词字符括起来的-将不会匹配(但即使用下划线括起来,也会避免匹配-)。你知道吗
\b
在Python3.6中,您可以使用一种技术来匹配和捕获您需要保留的内容(字母之间的
-
可以与[^\W\d_]-(?=[^\W\d_])
匹配),并且只匹配您需要删除的内容(所有非字母数字或您定义的任何字符)。你知道吗因此,示例
re.sub
如下所示或者
在哪里
([^\W\d_]-)(?=[^\W\d_])
-任意字母和-
后跟任意字母(允许连续匹配是正向的,如a-b-c
)|
-或(?:[^\w\s]|_)
-匹配任何单个非单词和非空白字符或_
。你知道吗r'\1'
是一个替换的backreference,一个占位符,它引用组1中的内容,并将其插入到结果字符串中。你知道吗参见regex demo。你知道吗
在3.5之前的Python版本中,需要使用lambda作为替换参数来检查组1是否匹配:
另一个可能的解决办法是
参见regex demo。在这里,由于使用了
\b
单词边界,用单词字符括起来的-
将不会匹配(但即使用下划线括起来,也会避免匹配-
)。你知道吗相关问题 更多 >
编程相关推荐