[英]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.