在Python中组合正则表达式——\W和\S

3

我希望我的代码仅返回特殊字符[".", "*", "=", ","]。我想要删除所有数字/字母字符("\W")和所有空格("\S")

import re

original_string = "John is happy. He owns 3*4=12, apples"
new_string = re.findall("\W\S",original_string)
print(new_string)

但是,我得到的输出却是这样的:[' i', ' h', ' H', ' o', ' 3', '*4', '=1', ' a']

我完全不知道为什么会出现这种情况。因此我有两个问题:

1)是否可以使用正则表达式来实现我的目标?

2)我的代码实际上是怎么回事?

原始答案翻译成“最初的回答”。


@Toto 我完全支持关闭重复问题,但是对于在这种情况下作为目标的如此广泛的帖子的实用性有些怀疑。如果你能找到一个更具体的帖子,那就太好了。 - cs95
@cs95:第三段“字符类”解释了\w\W以及\s\S之间的区别。 - Toto
1
@cs95:我理解你的观点,只是重新打开这个问题。 - Toto
3个回答

3

您接近了答案,但需要在字符类内指定这些转义序列。

re.findall(r'[^\w\s]', original_string)
# ['.', '*', '=', ',']

请注意,插入符号^表示否定(即不匹配这些字符)。
或者,不是删除您不需要的内容,而是提取您需要的内容如何?
re.findall(r'[.*=,]', original_string)
# ['.', '*', '=', ',']

什么是否定?鉴于原作者的要求,[\W\S]更加明显一些。 - tripleee
@tripleee 当我在 Python3.6 上尝试使用 re.findall(r'[\W\S]', original_string) 时,它不起作用,我只是认为这是错误的。也许有一些技巧... - cs95
我也很好奇为什么这个不起作用,但显然它确实不起作用! - EML
1
@EML 这可能是一个我们正在讨论的明显细节,但我找不到任何明确讨论这个差异的文档。 - cs95
1
我改正了,这两者并不等同。对我理解力有限感到抱歉。 - tripleee
显示剩余5条评论

2
正则表达式\W\S匹配一个由两个字符组成的序列; 一个非单词字符和一个非空格字符。如果您想将它们结合起来,那就是[^\w\s],它匹配一个不属于单词或空白组的字符。
然而,有许多字符不属于您枚举的字符之一,但仍与此表达式匹配。如果您想删除不在集合中的字符,则包含所有这些字符的字符类简单地为[^.*=,] 也许值得注意的是,在[...]内部,您不需要(实际上不应该)反斜杠转义例如文字点。默认情况下,字符类无法匹配换行符,尽管有一个选项re.DOTALL可以更改这一点。
如果您正在尝试提取和解析数字表达式,则正则表达式可以成为词汇分析的有用部分,但您确实需要一个适当的解析器。

感谢 @cs95 耐心地解释那些显而易见的东西。 - tripleee

2
在这里,我们可以在[]中添加我们想要的特殊字符,滑动其他所有内容,然后仅收集那些字符: "最初的回答"
([\s\S].*?)([.*=,])?

Python Test

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"([\s\S].*?)([.*=,])?"

test_str = "John is happy. He owns 3*4=12, apples"

subst = "\\2"

# You can manually specify the number of replacements by changing the 4th argument
result = re.sub(regex, subst, test_str, 0, re.MULTILINE)

if result:
    print (result)

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

JavaScript Demo

const regex = /([\s\S].*?)([.*=,])?/gm;
const str = `John is happy. He owns 3*4=12, apples`;
const subst = `$2`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);

正则表达式

如果这不是我们想要的表达式,我们可以在regex101.com上进行修改/更改。

enter image description here

正则表达式电路图

我们还可以在jex.im中可视化表达式:

enter image description here

演示


2
你为什么要离题谈论JavaScript? - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接