识别含有连续大写字母的行

-1 投票
4 回答
1110 浏览
提问于 2025-04-17 18:42

我想找一种逻辑,可以在Python中搜索一行里的大写字母单词,比如我有一个*.txt文件:

aaa
adadad     
DDD_AAA    
Dasdf Daa

我想只搜索那些有两个或更多大写字母单词连在一起的行(在上面的例子中就是DDD_AAA)。

4 个回答

0

假设你定义的“首字母大写词”是由两个或更多大写字母(不是数字)组成的字符串,也就是 [A-Z]。同时,假设分隔一个“首字母大写词”和另一个的不是简单的非大写字母,而是所有非字母数字的字符,也就是 [^a-zA-Z0-9],那么你需要找的正则表达式大概是这样的:

\b[A-Z]{2,}\b.*\b[A-Z]{2,}\b

我说“大概”是因为上面的说法并不完全正确:\b 会把下划线 _ 也算作一个单词字符。你可以把 \b 替换成 [^a-zA-Z0-9],并用环视断言把它包起来(这样它就变成零宽度的,像 \b 一样),这样你就得到了正确的正则表达式:

(?<=[^a-zA-Z0-9]|^)[A-Z]{2,}(?=[^a-zA-Z0-9]).*(?<=[^a-zA-Z0-9])[A-Z]{2,}(?=[^a-zA-Z0-9]|$)

这里有一个 Rubular 的演示。

最后,如果你把一个字符的词也算作“词”,那么只需要去掉 {2,} 这个量词就可以了:

(?<=[^a-zA-Z0-9]|^)[A-Z]+(?=[^a-zA-Z0-9]).*(?<=[^a-zA-Z0-9])[A-Z]+(?=[^a-zA-Z0-9]|$)
0
print re.findall("[A-Z][a-zA-Z]*\s[A-Z][a-zA-Z]",search_text)

应该可以用来匹配两个都以大写字母开头的单词

针对你具体的例子

lines = []
for line in file:
   if re.findall("[A-Z][a-zA-Z]*\s[A-Z][a-zA-Z]",line): lines.append(line)

print lines

基本上要看看正则表达式!

0

正则表达式是解决问题的好方法:

import re
pattern = "([A-Z]+_[A-Z]+)" # matches CAPITALS_CAPITALS only
match = re.search(pattern, text)
if match: print match.group(0)

不过,你得先弄清楚你到底在找什么。

撰写回答