我无法在 python 中找到正常的正则表达式来拆分这些字符串:
CAT One | desired: CAT
DOG SILVER FOX Two | desired: DOG SILVER FOX
KING KONG | desired: KING KONG
P'OT THEN Mark First | desired P'OT THEN
只是愚蠢的例子,但我需要将大写的单词与仅大写的单词分开。
我可以使用{1,n}
大写单词和{0,n}
大写单词。
我的正则表达式太奇怪了,我抓住所有字符串或只有一个大写单词..
答案 0 :(得分:1)
import re
lines = [
"CAT One",
"DOG SILVER FOX Two",
" KING KONG ",
"P'OT THEN Mark First",
"FOO-BAR Second FISH",
"horsE YELLOW thirD BLUE",
]
for line in lines:
print re.findall(r'\b[A-Z]+(?:\W*[A-Z]+)*\b', line)
输出:
['CAT']
['DOG SILVER FOX']
['KING KONG']
["P'OT THEN"]
['FOO-BAR', 'FISH']
['YELLOW', 'BLUE']
说明:
\b[A-Z]+
表示:匹配一个或多个大写字母,但仅限于单词的开头。这将匹配“黄色”,但不匹配“horsE”中的“E”。
\W*[A-Z]+
表示:匹配零个或多个非单词字符,后跟一个或多个大写字母。这将匹配“'OT”或“-BAR”或“KONG”。
(?:\W*[A-Z]+)*\b
表示:创建一个匹配零次或多次的(非捕获)组,但仅限于一个单词的结尾。这将匹配“SILVER FOX”,但不会跟随它的“T”。
答案 1 :(得分:1)
非正则表达式解决方案:
tests = """\
CAT One
DOG SILVER FOX Two
KING KONG
P'OT THEN Mark First
""".splitlines()
isAllUppercase = lambda s: all(c.upper() == c for c in s)
from itertools import takewhile
for t in tests:
print t
print ' '.join(takewhile(isAllUppercase,t.split()))
print
给出:
CAT One
CAT
DOG SILVER FOX Two
DOG SILVER FOX
KING KONG
KING KONG
P'OT THEN Mark First
P'OT THEN
答案 2 :(得分:0)
[^a-z ](?![a-z])| (?![A-Z]?[a-z])
非小写字母或空格后面没有小写字母(所以大写字母加数字加上符号)
OR
空格未跟随(可选的大写字母)和小写字母。
目前尚不清楚是否应预先挂起^
,因为大写字词始终是第一位。
^[^a-z ](?![a-z])| (?![A-Z]?[a-z])
(我们忽略了空格作为第一个字符的情况。所以没有(space)KING KONG
。如果要包含它,请在^
之后加|
,如{{1} 1}})
答案 3 :(得分:0)
你应该能够以负面展望对它进行排序。您扫描大写NOT后跟小写
[A-Z']+ ?[A-Z']+?(?![a-z])
[A-Z']
是您要匹配的字符范围,如果您需要更多标点符号,则'
只需将它们添加到此范围即可。