标识具有连续大写字母的行



我正在寻找在python中搜索一行大写单词的逻辑,就像我有一个*.txt:

aaa
adadad     
DDD_AAA    
Dasdf Daa

我只想搜索彼此后有 2 个或更多大写单词的行(在上述情况下为 DDD_AAA(。

正则表达式是要走的路:

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

不过,您必须弄清楚您到底在寻找什么。

假设您对"大写单词"的定义是两个或多个大写字母(非数字(字符的字符串,[A-Z],并假设将一个"大写单词"与另一个"大写单词"分开的并不完全是互补集([^A-Z](,而是字母数字字符的互补集,[^a-zA-Z0-9],您正在寻找

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

我说喜欢是因为上面并不完全正确:b下划线_算作单词字符。将 b s 替换为包装在环视断言中的 [^a-zA-Z0-9] s(使它们宽度为零,如 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]|$)
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

基本上研究正则表达式!

你来了:

import re
lines = open("r1.txt").readlines()
for line in lines:
    if re.match(r'[^w]*[A-Z]+[ _][A-Z]+[^w]*', line) is not None:
        print line.strip("n")

输出:

DDD_AAA

最新更新