繁体   English   中英

在正则表达式中过滤单词

[英]Filter words in Regular expression

因此,最近我接触了 Python 中的正则表达式,并且在网上遇到了一些代码,用于从包含在其他子字符串中的字符串列表中过滤单词。

def Filter(string, substr):
    return [str for str in string
    if re.match(r'[^\d]+|^', str).group(0) in substr]

它看起来非常简单,并且对于我遇到的特定问题效果很好,但我真的无法理解它的含义以及它是如何工作的。 这看起来很混乱。 任何人都可以像我是婴儿之类的那样向我解释吗? 我的编码技能不是很好,而且我还是个菜鸟。

明确地说,代码有效,我很高兴继续前进,我只是不明白这一点。

[^\d]匹配任何不是数字的字符; 这也可以写成\D

+在模式之后表示匹配匹配模式的任何字符序列,因此[^\d]+匹配非数字序列。

| 分隔备选模式以进行匹配。

第二种选择^匹配字符串的开头。 每个字符串都会匹配这个。 我认为他们使用它只是为了避免匹配失败,以便您始终可以在结果上调用.group(0) 他们可以通过在第一个选项中将+更改为*来完成相同的事情,因为这意味着匹配的序列可以是 0 次重复。

re.match()在参数字符串的开头查找正则表达式的匹配项。 .group(0)返回与整个正则表达式匹配的内容。 所以这整个事情返回str中非数字的初始序列。

最后,列表理解返回strings中非数字初始序列在substr中的任何项目。

通过我上面提到的简化,这可以重写:

def Filter(string, substr):
    return [item for item in string
            if re.match(r'\D*', item).group(0) in substr]

请注意,如果任何项目以数字开头,则正则表达式的结果将是一个空字符串,而空字符串是每个字符串的子字符串。 因此这些项目将包含在过滤结果中。 我怀疑这不是预期的结果。

我将尽力为您解释这一点。

所以基本上我们正在创建一个名为“ filter ”的方法并传递两个参数,即“ string (要搜索的)”和“ substring (要搜索的)”。 然后我们在python 返回函数中使用re.match以及for 循环中的if 条件(for 循环帮助我们一个一个地遍历主字符串)。 至于: (r'[^\d]+|^' :这是一个正则表达式模式,其中 \d 是数字的正则表达式模式, + 表示至少一个或多个,最后它们在 () 内关闭,这意味着您要捕获的组。

re.match: re.match 是一个函数,它只从字符串的开头搜索并返回匹配的对象(如果找到)。 但是,如果在中间某处找到子字符串,则它只会返回 none。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM