*.txt があるように、Python の行で大文字の単語を検索するロジックを探しています。
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)
ただし、探しているものを正確に把握する必要があります。
print re.findall("[A-Z][a-zA-Z]*\s[A-Z][a-zA-Z]",search_text)
どちらも大文字で始まる 2 つの単語に一致するように動作するはずです
あなたの特定の例のために
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
基本的に正規表現を調べてください!
「大文字の単語」の定義が 2 つ以上の大文字のアルファベット (数字以外の) 文字の文字列、つまり [A-Z]
であると仮定し、ある「大文字の単語」を別の単語から分離するものは完全に補完的なセット ( [^A-Z]
) ではなく、英数字の補完セット、つまり、次の ような[^a-zA-Z0-9]
正規表現を探しています
\b[A-Z]{2,}\b.*\b[A-Z]{2,}\b
上記が正確ではないため、好きと言います。アンダースコアを単語文字として\b
カウントします。s をルックアラウンド アサーションでラップされたs に_
置き換えて( のようにゼロ幅にするため)、正しい正規表現が得られます。\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]|$)
最後に、「単語」という 1 文字の単語を考える場合は、単純に{2,}
量指定子を削除します。
(?<=[^a-zA-Z0-9]|^)[A-Z]+(?=[^a-zA-Z0-9]).*(?<=[^a-zA-Z0-9])[A-Z]+(?=[^a-zA-Z0-9]|$)
どうぞ:
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