正则表达式与大写分开

时间:2010-02-16 14:14:06

标签: python regex string split uppercase

我想使用正则表达式将'HDMWhoSomeThing'之类的字符串替换为'HDM Who Some Thing'

所以我想提取以大写字母开头或仅由大写字母组成的单词。请注意,在字符串'HDMWho'中,最后一个大写字母实际上是单词Who的第一个字母 - 并且不应包含在单词HDM中。

实现这一目标的正确正则表达方式是什么?我尝试过很多类似于[A-Z][a-z]+的正则表达式但没有成功。 [A-Z][a-z]+给了我'Who Some Thing' - 当然没有'HDM'

有什么想法吗? 谢谢, Rukki

5 个答案:

答案 0 :(得分:2)

尝试使用此正则表达式进行拆分:

/(?=[A-Z][a-z])/

如果您的正则表达式引擎不支持拆分空匹配,请尝试使用此正则表达式在单词之间放置空格:

/([A-Z])(?![A-Z])/

将其替换为" $1"(空格加上第一组的匹配)。然后你可以在空间分开。

答案 1 :(得分:2)

一个班轮:

''。join(a或b代表a,b代表re.findall('([AZ] [az] +)|(?:( [AZ] *)(?= [AZ]))',多个))

使用regexp

([A-Z] [A-Z] +)|(?:?([A-Z] *)(= [A-Z]))

答案 2 :(得分:2)

#! /usr/bin/env python

import re
from collections import deque

pattern = r'([A-Z]{2,}(?=[A-Z]|$)|[A-Z](?=[a-z]|$))'
chunks = deque(re.split(pattern, 'HDMWhoSomeMONKEYThingXYZ'))

result = []
while len(chunks):
  buf = chunks.popleft()
  if len(buf) == 0:
    continue
  if re.match(r'^[A-Z]$', buf) and len(chunks):
    buf += chunks.popleft()
  result.append(buf)

print ' '.join(result)

输出:

HDM Who Some MONKEY Thing XYZ

根据代码行判断,此任务更适合re.findall

pattern = r'([A-Z]{2,}(?=[A-Z]|$)|[A-Z][a-z]*)'
print ' '.join(re.findall(pattern, 'HDMWhoSomeMONKEYThingX'))

输出:

HDM Who Some MONKEY Thing X

答案 3 :(得分:1)

可能是'[A-Z] *?[A-Z] [a-z] +'?

编辑:这似乎有效:[A-Z] {2,}(?![a-z])| [A-Z] [a-z] +

import re

def find_stuff(str):
  p = re.compile(r'[A-Z]{2,}(?![a-z])|[A-Z][a-z]+')
  m = p.findall(str)
  result = ''
  for x in m:
    result += x + ' '
  print result

find_stuff('HDMWhoSomeThing')
find_stuff('SomeHDMWhoThing')

打印出来:

  HDM Who Some Thing

     

一些HDM谁有事

答案 4 :(得分:1)

在这种情况下,'字'是:

  1. 任意数量的大写字母 - 除非最后一个大写字母后面跟一个小写字母。
  2. 一个大写字母,后跟任意数量的小写字母。
  3. 所以试试:

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

    第一次交替包括一个负前瞻(?![a-z]),它处理全大写字和初始大写字之间的边界。