【问题标题】:Need help to find right Regex match pattern需要帮助找到正确的正则表达式匹配模式
【发布时间】:2011-10-29 10:56:45
【问题描述】:

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

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

【问题讨论】:

  • 您应该总是(几乎)指定您使用正则表达式的语言。甚至写在regex标签描述中

标签: python regex uppercase


【解决方案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]+ 表示:匹配一个或多个大写字母,但仅限于单词的开头。这将匹配“YELLOW”,但不匹配“horsE”中的“E”。

\W*[A-Z]+ 表示:匹配零个或多个非单词字符,后跟一个或多个大写字母。这将匹配“'OT”或“-BAR”或“KONG”。

(?:\W*[A-Z]+)*\b 表示:创建一个匹配零次或多次的(非捕获)组,但仅在单词的末尾。这将匹配“SILVER FOX”,但不匹配它后面的“T”。

【讨论】:

  • 感谢它的工作。什么是 ?: ?你能解释一下正则表达式吗?
  • @avastreg。很高兴你发现它有用。我已经为我的答案添加了解释。
【解决方案2】:

非正则表达式解决方案:

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

【讨论】:

  • 是的,我同时做了这个.. 但我想知道怎么做,以防万一找不到替代品
【解决方案3】:
[^a-z ](?![a-z])| (?![A-Z]?[a-z])

非小写字母或空格后不跟小写字母(所以大写字母加数字加符号)

空格后面没有(可选的大写字母)和小写字母。

不清楚是否应该在前面加上^,因为大写字母总是在前。

^[^a-z ](?![a-z])| (?![A-Z]?[a-z])

(我们在这里忽略了空格作为第一个字符的情况。所以没有(space)KING KONG。如果要包含它,请在| 后面加上^,例如^ (?![A-Z]?[a-z])

【讨论】:

    【解决方案4】:

    您应该能够以消极的眼光对其进行排序。您扫描大写而不是小写

    [A-Z']+ ?[A-Z']+?(?![a-z])
    

    [A-Z'] 是您要匹配的字符范围,如果您需要更多标点符号,那么只需将' 添加到此范围内即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      相关资源
      最近更新 更多