Python:使用正则表达式将大小写转换为空格分隔,并考虑首字母缩略词

Python:使用正则表达式将大小写转换为空格分隔,并考虑首字母缩略词,python,regex,Python,Regex,我正在尝试使用python将大小写转换为空格分隔的值。例如: divLineColor->div线条颜色 这一行成功地做到了: label = re.sub("([A-Z])"," \g<0>",label) 但这会产生奇怪的结果,比如: DIVLINECLOR->divL vineC eolor 我还认为使用(?!…)可以工作,但我没有任何运气 \g引用整个模式的匹配字符串,\g引用第一个子模式的匹配字符串((…))。因此,您应该使用\g和\g: label = re.sub("

我正在尝试使用python将大小写转换为空格分隔的值。例如:

divLineColor->div线条颜色

这一行成功地做到了:

label = re.sub("([A-Z])"," \g<0>",label)
但这会产生奇怪的结果,比如:

DIVLINECLOR->divL vineC eolor

我还认为使用
(?!…)
可以工作,但我没有任何运气

\g
引用整个模式的匹配字符串,
\g
引用第一个子模式的匹配字符串(
(…)
)。因此,您应该使用
\g
\g

label = re.sub("([a-z])([A-Z])","\g<1> \g<2>",label)
label=re.sub(“([a-z])([a-z])”,“\g\g”,label)

(?我找不到一个非常好的正则表达式,但它工作得很好

([a-z]+)([a-z][a-z]+)?([a-z][a-z]+)([a-z][a-z]+)?([a-z][a-z]+)?

将其分解为:

([a-z]+)
任何一系列小写字符

([A-Z][A-Z]+)?
任何大写字符后跟1个或多个小写字符。这是可选的


然后,我将第二组重复了4次。这只适用于不超过4个“节”或大写字符的情况。根据需要添加或删除该正则表达式分组。如果少于此数字,它将有效(即,它将适用于
divLineColor
)这在全大写的单词上不匹配。

这应该适用于“divLineColor”、“simpleBigURL”、“OldHTMLFile”和“SQLServer”

>>> def unCamel(x): return reduce(lambda a,b: a + ((b.upper() == b and (len(a) and a[-1].upper() != a[-1])) and (' ' + b) or b), x, '')
... 
>>> 
>>> unCamel("simpleBigURL")
'simple Big URL'
>>> unCamel("URL")
'URL'
>>> unCamel("url")
'url'
>>> unCamel("uRl")
'u Rl'
label = re.sub(r'((?<=[a-z])[A-Z]|(?<!\A)[A-Z](?=[a-z]))', r' \1', label)

label=re.sub(r')((?我知道,它不是正则表达式。但是,您也可以这样使用它

>>> s = 'camelCaseTest'
>>> ''.join(map(lambda x: x if x.islower() else " "+x, s))
'camel Case Test'

下面是我的简单解决方案,它与类似PCRE的实现一起工作,包括Python:

/(?<=[a-zA-Z])(?=[A-Z])/g

我认为您不能使用正则表达式,因为您需要记住上一个元素才能对所有情况执行此操作。我认为以下函数适用于所有情况。例如,它将“AbcdEfgHIJKlmno”转换为“ABCDEFG HIJ Klmno”

def camel_case_to_phrase(s):
  prev = None
  t = []
  n = len(s)
  i = 0

  while i < n:
    next_char = s[i+1] if i < n -1 else ''
    c = s[i]
    if prev is None:
        t.append(c)
    elif c.isupper() and prev.isupper():
        if next_char.islower():
            t.append(' ')
            t.append(c)
        else:
            t.append(c)
    elif c.isupper() and not prev.isupper():
        t.append(' ')
        t.append(c)
    else:
        t.append(c)
    prev = c
    i = i +1

return "".join(t)
def camel_case_to_短语:
prev=无
t=[]
n=长(s)
i=0
而i
希望此方法有助于:

public static String convertCamelCaseToStatement(String camelCase) {
    StringBuilder builder = new StringBuilder();
    for (Character c : camelCase.toCharArray()) {
        if (Character.isUpperCase(c)) {
            builder.append(" ").append(c);
        } else {
            builder.append(c);
        }
    }
    return builder.toString();
}
其他方法:

def solution(s):
    return ''.join(' ' + c if c.isupper() else c for c in s)
print(solution("mehdHidi"))

没有正则表达式,一些问题可以更容易地解决。如果它不能在所有的超级大小写上工作,那么唯一的限定符就是小写字母和大写字母之间的边界。聪明!但不考虑像“OldHTMLFile”和“SQLServer”这样的情况,也就是说,将缩写拆分为普通字母word@NasBanov这是一个更复杂的公关可能需要拼写检查人工智能的问题。例如,
MyJSONAISpec
应该是
MyJSONAISpec
,但是什么正则表达式可以解决这个问题呢?你要么得到
MyJSONAISpec
MyJSONAISpec
,要么
MyJSONAISpec
@Supuhstar不能在这里期待魔法精灵。我假定“MyJSONAISpec”是您的示例的预期分割。应该改变大小写以标记单独的单词-可能您希望JSON和AI在视觉上对人类是分开的,因此名称应该是“MyJsonAISpec”或“MyJsonAISpec”或“MyJsonAISpec”或者使用下划线。让我们不要让机器人理解人类不清楚的东西。Mathias在下面发布了关于“URLSimplyBig”的合理解决方案;-)尝试了此页面上的所有re。这一个对我来说最具兼容性。一年后查看我的答案:“天哪,我应该添加一些注释”。)这就像是肉中刺。我现在添加了解释。我喜欢这个答案;这里有一些语法糖,我用于这些类型的东西:convert\u camel\u case=functools.partial(re.compile(r“…”,flags=re.VERBOSE.sub,r'\1'))只是好奇。在我的例子中,我希望字符串的开头是大写字母。所以<代码> SimeBigURL> <代码>必须返回<代码>简单的大URL< /代码>。这可以调整到我的需要吗?或者它是另一个正则表达式吗?请考虑包含关于你的答案的一些信息,而不是简单地张贴代码。我们试图提供不只是“修复”,而是帮助人们L。挣钱。你应该解释原始代码中的错误,你做了什么不同的事情,以及为什么你的更改有效。@AndrewBarber感谢你的关注-1.这个问题非常明确地要求使用
SimpleGurl
等(即所有大写字母的首字母缩写),这是您的解决方案完全失败的地方。这不包括首字母缩略词。
def camel_case_to_phrase(s):
  prev = None
  t = []
  n = len(s)
  i = 0

  while i < n:
    next_char = s[i+1] if i < n -1 else ''
    c = s[i]
    if prev is None:
        t.append(c)
    elif c.isupper() and prev.isupper():
        if next_char.islower():
            t.append(' ')
            t.append(c)
        else:
            t.append(c)
    elif c.isupper() and not prev.isupper():
        t.append(' ')
        t.append(c)
    else:
        t.append(c)
    prev = c
    i = i +1

return "".join(t)
public static String convertCamelCaseToStatement(String camelCase) {
    StringBuilder builder = new StringBuilder();
    for (Character c : camelCase.toCharArray()) {
        if (Character.isUpperCase(c)) {
            builder.append(" ").append(c);
        } else {
            builder.append(c);
        }
    }
    return builder.toString();
}
def solution(s):
    return ''.join(' ' + c if c.isupper() else c for c in s)
print(solution("mehdHidi"))