我希望我的代码仅返回特殊字符[".", "*", "=", ","]
我要删除所有数字/字母字符("\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)我的代码实际上在做什么?
答案 0 :(得分:3)
您已经接近了,但是您需要在角色类中指定这些转义序列。
re.findall(r'[^\w\s]', original_string)
# ['.', '*', '=', ',']
请注意,插入符号^
表示否定(即不匹配这些字符)。
或者,不删除不需要的内容,为什么不提取您的操作呢?
re.findall(r'[.*=,]', original_string)
# ['.', '*', '=', ',']
答案 1 :(得分:2)
在这里,我们还可以在[]
中添加所需的特殊字符,然后轻扫其他所有内容,然后仅收集这些字符:
([\s\S].*?)([.*=,])?
# 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.
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中对其进行修改/更改。
我们还可以可视化jex.im中的表达式:
答案 2 :(得分:1)
正则表达式\W\S
匹配两个字符的序列;一个非单词,一个非空格。如果要组合它们,那就是[^\w\s]
,它与一个不属于单词或空白组的字符匹配。
但是,有许多字符不是您枚举的与该表达式匹配的字符之一。如果要删除不在集合中的字符,则包含所有这些字符的字符类就是[^.*=,]
也许值得一提的是,在[...]
中,您不需要(实际上也不需要)例如反斜杠转义。文字点。默认情况下,字符类不能与换行符匹配,尽管可以使用选项re.DOTALL
进行更改。
如果您试图提取和解析数字表达式,则正则表达式可能是词法分析中有用的一部分,但您确实需要一个合适的解析器。