2017-04-15 208 views
0

我试图学习如何使用正则表达式,但有一个问题。比方说,我有串正则表达式 - 在字符串中查找大写字

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))Cowprint(test.group(2))w,第一场比赛的最后一个字母(没有其他元素test.group)。

任何有关指出这个问题和/或如何更好地解决问题的建议?

回答

1

由于内括号,比赛的最后一个字母在组中。只要放弃这些,你就会好起来的。

>>> 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)

+0

谢谢你。对,我根本不需要那个括号! – Argon

+1

更多,你在这里不需要任何括号。 're.findall(r'\ b [A-Z] [a-z] + \ b',line)'是你所需要的。 –

1

我使用findall函数来查找与正则表达式匹配的所有实例。使用len来查看有多少匹配,在这种情况下,它打印出3。您可以检查长度是否大于2,并返回TrueFalse

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个大写字母。

+1

@Argon,我添加了一个纯正则表达式解决方案,不知道它是否更好 – davidhu2000