我正在学习正则表达式,但我无法理解某些事情。我正在编写一个使用正则表达式来查找各种字符和字符串中的单词的作业:
使用findall函数,获取所有非实例 分配给'lorem_ipsum'
的字符串中的字母数字字符输出到控制台,非字母数字字符的数量。 提示:使用len函数。使用^和[]正则表达式 运算符以及findall()正则表达式函数。
pattern = re.compile(r'sit-:amet')
occurrance_sit_amet = pattern.findall(lorem_ipsum)
for match in occurrance_sit_amet:
print (match)
为什么我要使用len功能?甚至更令人费解的是,为什么我会使用^和[],当它们只能用于查找字符串开头的字符和括号中的字符?我的代码也给了我这个错误:
无法读取未定义的属性'toISOString' - 9b2bb9d0-119a-11e8-95f3-4351563e5e1b
有人可以解释这意味着什么吗?
答案 0 :(得分:1)
我认为你误解了暗示是什么(尽管我承认它们有误导性)。当它显示“使用^
和[]
”时,它不会告诉您使用字符类([]
)和字符串锚点(^
)的开头。它告诉您将字符[]
和^
组合在一起以形成反向字符类[^]
。反向字符类中的所有内容都不会匹配。
你需要的正则表达式是:
[^a-zA-Z0-9]
这意味着“一切 但 a-z,A-Z或0-9”
关于len
函数,您的任务是查找有多少非字母数字字符,不是吗? findall
返回匹配列表。这就是为什么你需要找到列表的长度来找出有多少这样的字符。
以下是一些代码:
pattern = re.compile(r'[^a-zA-Z0-9]')
allMatches = pattern.findall(lorem_ipsum)
print(len(allMatches))
答案 1 :(得分:0)
回答你的问题:
findall
返回matches
,这是与您的模式匹配的所有子字符串的列表。因此len(matches)
应该为您提供非字母数字字符数。" ^
can be used in conjunction with []
to do a search for patterns NOT containing certain characters。您的正则表达式可能导致该错误的一些问题:
t
到:
的字符,这并不意味着什么。r'sit-:amet'
匹配由一个接一个的特定小写字母组成的字符串。即使正则表达式有效,这也不符合您所期望的"非字母数字"图案。您需要的是对任何字母数字的否定搜索:
[^A-Za-z0-9]
P.S。强烈建议您在使用正则表达式时使用regexr。这是检查模式匹配语法如何工作并测试正则表达式的好方法:)