【问题标题】:Insert space if uppercase letter is preceded and followed by one lowercase letter - Python如果大写字母前后有一个小写字母,则插入空格 - Python
【发布时间】:2020-09-03 02:16:04
【问题描述】:

如果空格包含大写字母(但不是第一个字母),是否可以插入空格?

例如,给定 "RegularExpression",我想获得 "RegularExpression"

我尝试了以下正则表达式:

re.sub("[a-z]{1}[A-Z][a-z]{1}", " ","regularExpression") 

很遗憾,这会删除匹配模式:

regula pression

我更喜欢正则表达式解决方案,但我会感谢任何可行的解决方案。 谢谢!

【问题讨论】:

  • “美国”呢?
  • 不应该被拆分,只要大写字母在一个字符串中,并且分别在一个小写字母之后/之前。
  • 如果您只想在字符串的不同位置插入空格,则不应使用“拆分”一词。拆分字符串意味着返回包含字符串不同部分的数组或列表。

标签: python regex string nlp


【解决方案1】:
In [1]: s = 'RegularExpression'

In [2]: answer = []

In [3]: breaks = [i for i,char in enumerate(s) if char.isupper()]

In [4]: breaks = breaks[1:]

In [5]: answer.append(s[:breaks[0]])

In [6]: for start,end in zip(breaks, breaks[1:]):
   ...:     answer.append(s[start:end])
   ...:

In [7]: answer.append(s[breaks[-1]:])

In [8]: answer
Out[8]: ['Regular', 'Expression']

In [9]: print(' '.join(answer))
Regular Expression

【讨论】:

    【解决方案2】:

    您可以通过以下方式做到这一点:

    import re
    
    s = "RegularExpression"
    re.sub(r"([A-Z][a-z]+)([A-Z][a-z]+)", r"\1 \2", s)
    

    这意味着“在第一个匹配组和第二个匹配组之间放置一个空格”,其中匹配组是一个大写字母,后跟一个或多个非大写字母。

    【讨论】:

    • 谢谢伙计,这正是我所渴望的。只是一个注释,我将它稍微编辑为:“([a-z]+)([A-Z][a-z]+)”
    • 干杯,芽。如果它有帮助,请随时检查它作为答案,以表明它帮助您到达那里。
    【解决方案3】:

    尝试使用 Lookbehind "(?<=[a-z])([A-Z])"

    例如:

    import re
    
    s = "RegularExpression"
    print(re.sub(r"(?<=[a-z])([A-Z])", r" \1", s))
    

    输出:

    Regular Expression
    

    【讨论】:

    • 您也可以使用完整匹配而不是组print(re.sub(r"(?&lt;=[a-z])[A-Z]", r" \g&lt;0&gt;", s))++
    【解决方案4】:

    据我了解,当一个大写字母前面是一个小写字母时,您希望在它们之间插入一个空格。您可以使用re.sub 将以下正则表达式的(零宽度)匹配项替换为空格。

    r'(?<=[a-z])(?=[A-Z])'
    

    Regex demo ¯\(ツ)>Python code

    请注意,正则表达式演示链接中的 SUBSTITUTION 框包含一个空格。

    Python 的正则表达式引擎执行以下操作。

    (?<=[a-z])  : use a positive lookbehind to assert that the match is preceded
                  by a lowercase letter
    (?=[A-Z])   : use a positive lookahead to assert that the match is followed
                  by an uppercase letter
    

    对于字符串 'RegularExpression',正则表达式匹配字母 'r''E' 之间的位置(即零宽度匹配)。

    【讨论】:

    • @Thefourthbird,我代替你的 em-dash ()。
    【解决方案5】:

    IIUC,一种使用re.findall的方式:

    re.findall("[A-Z][a-z]+", "RegularExpression")
    

    输出:

    ['Regular', 'Expression']
    

    【讨论】:

      猜你喜欢
      • 2011-07-31
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 2016-08-11
      • 1970-01-01
      • 2012-02-04
      • 1970-01-01
      相关资源
      最近更新 更多