4

我想用正则表达式替换'HDMWhoSomeThing'字符串'HDM Who Some Thing'

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

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

有任何想法吗?谢谢, 鲁基

4

5 回答 5

2

尝试用这个正则表达式拆分:

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

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

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

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

于 2010-02-16T14:17:00.273 回答
2

一个班轮:

' '.join(a or b for a,b in re.findall('([AZ][az]+)|(?:([AZ]*)(?=[AZ]))',s))

使用正则表达式

([AZ][az]+)|(?:([AZ]*)(?=[AZ]))

于 2010-02-16T14:59:17.450 回答
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
于 2010-02-16T15:07:34.827 回答
1

可能是'[AZ]*?[AZ][az]+'?

编辑:这似乎有效:[AZ]{2,}(?![az])|[AZ][az]+

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 谁有事

一些 HDM Who Thing

于 2010-02-16T14:17:39.360 回答
1

因此,在这种情况下,“单词”是:

  1. 任意数量的大写字母 - 除非最后一个大写字母后跟一个小写字母。
  2. 一个大写字母后跟任意数量的小写字母。

所以试试:

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

第一个替换包括一个负前瞻 (?![az]),它处理全大写单词和初始大写单词之间的边界。

于 2010-02-16T14:59:04.893 回答