需要帮助才能找到正确的Regex匹配模式

时间:2011-10-29 10:56:46

标签: python regex uppercase

我无法在 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}大写单词。

我的正则表达式太奇怪了,我抓住所有字符串或只有一个大写单词..

4 个答案:

答案 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']是您要匹配的字符范围,如果您需要更多标点符号,则'只需将它们添加到此范围即可。