正则表达式 - 在字符串中查找大写字母

13

我正在尝试学习如何使用正则表达式,但是有一个问题。假设我有以下字符串:

line = 'Cow Apple think Woof`

我想要查看line是否至少有两个以大写字母开头的单词(当然,它确实有)。在Python中,我尝试了以下代码:

我想要检查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))是第一个匹配项的最后一个字母wtest.group中没有其他元素)。

对于如何准确定位此问题和/或如何更好地解决该问题,您有什么建议吗?

3个回答

10
比赛的最后一个字母被包括在组中是因为有内部括号。只需删除它们,你就没问题了。
>>> 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)


谢谢你也一样。没错,我根本不需要那个括号! - Argon
3
这里不需要任何括号。re.findall(r'\b[A-Z][a-z]+\b', line) 就足够了。 - Wiktor Stribiżew

1
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.),它将在电子邮件地址的末尾返回。但是,这可以单独处理。

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大写字母开头的单词\b) - 查找首字母大写的单词
  • (.*) - 匹配0个或多个字符
  • (\b大写字母开头的单词\b) - 查找第二个首字母大写的单词

这种方法不够灵活,因为它无法匹配3个首字母大写的单词。


1
@Argon,我添加了一个纯正则表达式的解决方案,不确定它是否更好。 - davidhu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接