【问题标题】:Combining regular expressions in Python - \W and \S在 Python 中组合正则表达式 - \W 和 \S
【发布时间】:2019-05-20 07:14:30
【问题描述】:

我希望我的代码只返回特殊字符 [".", "*", "=", ","] 我想删除所有数字/字母字符("\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:它解释了第三段中\w & \W\s & \S 之间的区别:“字符类”
  • @cs95:我理解你的观点,重开问题。

标签: python regex string


【解决方案1】:

您很接近,但您需要在字符类中指定这些转义序列。

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

请注意,插入符号 ^ 表示否定(即,不要匹配这些字符)。

或者,与其删除你不需要的东西,不如提取你做的东西?

re.findall(r'[.*=,]', original_string)
# ['.', '*', '=', ',']

【讨论】:

  • 否定是怎么回事?考虑到 OP 的要求,[\W\S] 更加明显。
  • @tripleee re.findall(r'[\W\S]', original_string) 在 python3.6 上尝试时不起作用,我只是认为它不正确。也许有一个技巧......
  • @tripleee 这是我的看法:[^\w\s] 与 NOT(空格或 alnum)与 [\W\S] 相同(不是空格或非 alnum),如果您知道德摩根定律不是同样的事情......可能是错误的。
  • @EML 这可能是我们正在讨论的一个明显的细节,但我找不到任何专门讨论差异的文档。
  • ...我的立场是正确的,两者并不等同。抱歉,太密集了。
【解决方案2】:

在这里,我们还可以在[] 中添加我们想要的特殊字符,滑动其他所有内容,然后只收集这些字符:

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

Python 测试

# 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 演示

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中的表达式:

Demo

【讨论】:

  • 你为什么离题到 JavaScript?
【解决方案3】:

正则表达式\W\S匹配两个字符的序列;一个非单词,一个非空格。如果你想组合它们,那就是[^\w\s],它匹配一个既不属于单词也不属于空白组的字符。

但是,有许多字符不是您列举的与此表达式匹配的字符之一。如果你想删除不在你的集合中的字符,包含所有这些字符的字符类就是[^.*=,]

也许值得注意的是,在 [...] 内部,您不需要(实际上也不应该)反斜杠转义,例如字面点。默认情况下,字符类不能匹配换行符,但有一个选项 re.DOTALL 可以更改这一点。

如果您尝试提取和解析数值表达式,正则表达式可能是词法分析的有用部分,但您确实需要一个合适的解析器。

【讨论】:

  • 感谢 @cs95 耐心地解释应该显而易见的东西。
猜你喜欢
  • 2013-10-01
  • 2012-12-31
  • 1970-01-01
  • 2013-09-02
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-12
相关资源
最近更新 更多