我试图学习如何使用正则表达式,但有一个问题。我们说我有字符串
line = 'Cow Apple think Woof`
我想知道line
是否至少有两个以大写字母开头的单词(当然,它确实如此)。在Python中,我尝试执行以下操作
import re
test = re.search(r'(\b[A-Z]([a-z])*\b){2,}',line)
print(bool(test))
但打印False
。如果我改为
test = re.search(r'(\b[A-Z]([a-z])*\b)',line)
我发现print(test.group(1))
为Cow
但print(test.group(2))
为w
,即第一个匹配的最后一个字母(test.group
中没有其他元素) 。
有关精确定位此问题和/或如何更好地解决问题的任何建议吗?
答案 0 :(得分:2)
由于内括号,比赛的最后一个字母在组中。放下那些,你会没事的。
>>> t = re.findall('([A-Z][a-z]+)', line)
>>> t
['Cow', 'Apple', 'Woof']
>>> t = re.findall('([A-Z]([a-z])+)', line)
>>> t
[('Cow', 'w'), ('Apple', 'e'), ('Woof', 'f')]
大写单词的数量当然是len(t)
。
答案 1 :(得分:1)
我使用findall
函数查找与正则表达式匹配的所有实例。使用len
查看有多少匹配,在这种情况下,它打印出3
。您可以检查长度是否大于2并返回True
或False
。
import re
line = 'Cow Apple think Woof'
test = re.findall(r'(\b[A-Z]([a-z])*\b)',line)
print(len(test) >= 2)
如果您只想使用正则表达式,您可以搜索大写单词,然后搜索中间的一些字符和另一个大写单词。
test = re.search(r'(\b[A-Z][a-z]*\b)(.*)(\b[A-Z][a-z]*\b)',line)
print(bool(test))
(\b[A-Z][a-z]*\b)
- 找到大写单词(.*)
- 匹配0个或更多字符(\b[A-Z][a-z]*\b)
- 找到第二个大写字词这种方法并不具有动态性,因为它不适用于尝试匹配3个大写单词。
答案 2 :(得分:0)
import re
sent = "His email is abc@some.com, however his wife uses xyz@gmail.com"
x = re.findall('[A-Za-z]+@[A-Za-z\.]+', sent)
print(x)
如果电子邮件ID(abc @ some,com。)末尾有句点,则会在电子邮件地址末尾将其返回。但是,这可以单独处理。