删除中间含有大写字母的单词

1 投票
3 回答
1213 浏览
提问于 2025-04-18 14:57

我有一些词,比如:'objQuery'、'Barack Obama'、'expandableMap'、'mh17'、'MH17'。我正在清理一些文本,这些文本中夹杂了一些编程语言的内容。

我想找到像'objQuery'这样的词,这些词是连续的,也就是说中间没有空格,也没有大写字母(更像是一些编程语言中的标识符),我想用正则表达式来实现。

那么,应该用什么样的正则表达式呢?

我试过:

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

但是这样会把一些专有名词也给去掉。

我想要的结果是:

正确:'objQuery'、'expandableMap'

任何包含中间有大写字母的词。这个词可以以字母或数字开头。我可以通过循环字符来写一个布尔函数来实现这个,但我想找一个更简短的方法。

错误:'Barack Obama'、'mh17'、'MH17'

3 个回答

1
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
3

这不就是类似于:[a-z]+[A-Z][a-zA-Z]+,再加上需要的单词分隔符吗?

或者像Juan Lopes在评论中提到的那样,如果你还想匹配像objM这样的字符串,可以用[a-z]+[A-Z][a-zA-Z]*

3

我觉得你在找这个。

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

演示

>>> 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

演示

撰写回答