【问题标题】:Removing words with CAPITAL letters in between删除中间有大写字母的单词
【发布时间】:2014-07-27 16:52:08
【问题描述】:

我有这样的词:'objQuery'、'Barack Obama'、'expandableMap'、'mh17'、'MH17'。我正在清理带有少量编码语言的文本

我想在正则表达式的帮助下检测像“objQuery”这样连续的单词,即中间没有任何空格和大写字母(更像是一些编码语言标记)。

这样做的正则表达式是什么?

我试过了:

re.search(r'\w+[A-Z]+', term)

这也剥夺了专有名称。

我也想要结果:

真:'objQuery'、'expandableMap'

中间包含大写字母的任何单词。 Word 可以以字母数字字符开头。我可以遍历字符并形成一个布尔函数来这样做,但我正在寻找一些简短的东西。

错误:“巴拉克奥巴马”、“mh17”、“MH17”

【问题讨论】:

  • 必须是正则表达式吗?
  • 不可以是别的东西,因为它解决了目的
  • 上述示例的预期输出是什么?
  • 必须是a-z吗?也可以是objQuery_23
  • “objQuery”和“expandableMap”为真。 '巴拉克奥巴马'是错误的。

标签: python regex


【解决方案1】:

我想你正在寻找这个。

\b[a-z]+(?:[A-Z][a-z]+)+\b

DEMO

>>> s = "objQuery Barack Obama expandableMapFoo"
>>> m = re.findall(r'\b[a-z]+(?:[A-Z][a-z]+)+\b', s)
>>> m
['objQuery', 'expandableMapFoo']

\b[a-z0-9A-Z]+(?:[A-Z][a-z]+)+\b

DEMO

【讨论】:

  • 但它不会检测到 ExpandableMap。顺便说一句 (?:) 代表什么?
  • @mousecoder 见regex101.com/r/bL1cV0/11(?:) 表示非捕获组。
【解决方案2】:

不就是像:[a-z]+[A-Z][a-zA-Z]+,加上任何必要的单词分隔符吗?

或者,如果您还想匹配 objM 之类的字符串,Juan Lopes 在评论中建议,[a-z]+[A-Z][a-zA-Z]*

【讨论】:

  • 最后一个 + 不是真的需要,是吗?
  • @JuanLopes:给定字符串objMapping,你想匹配objMa还是objMapping
  • 哦,对不起,我的意思是它可能是一个 *。因为你也想匹配 objM。
  • @JuanLopes:这当然可能更有效,但是对于当前的示例,尚不清楚是否应该匹配。
  • 当然,只是一个建议:)
【解决方案3】:
def check(word):
    cap = word[0].isupper()
    for i,char in enumerate(word):
        if char == ' ':
            print('whitespace detected. Quitting')
            return False
        if char.isupper() and not cap:
            print('detected upper case in the middle of the word at position', i)

输出:

In [43]: check('objQuery')
detected upper case in the middle of the word at position 3

In [44]: check('Barack Obama')
whitespace detected. Quitting
Out[44]: False

In [45]: check('expandableMap')
detected upper case in the middle of the word at position 10

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 2015-07-18
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    相关资源
    最近更新 更多