我想使用正则表达式将'HDMWhoSomeThing'
之类的字符串替换为'HDM Who Some Thing'
。
所以我想提取以大写字母开头或仅由大写字母组成的单词。请注意,在字符串'HDMWho'
中,最后一个大写字母实际上是单词Who
的第一个字母 - 并且不应包含在单词HDM
中。
实现这一目标的正确正则表达方式是什么?我尝试过很多类似于[A-Z][a-z]+
的正则表达式但没有成功。 [A-Z][a-z]+
给了我'Who Some Thing'
- 当然没有'HDM'
。
有什么想法吗? 谢谢, Rukki
答案 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)
在这种情况下,'字'是:
所以试试:
([A-Z]+(?![a-z])|[A-Z][a-z]*)
第一次交替包括一个负前瞻(?![a-z]),它处理全大写字和初始大写字之间的边界。