我正在寻找在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