【问题标题】:Regex to split on uppercase but not if preceded by space?正则表达式拆分为大写,但如果前面有空格则不拆分?
【发布时间】:2017-04-18 00:51:11
【问题描述】:

在 Python 中是否有任何方法可以执行以下操作?我有一个像"Trip HopDowntempoSynth-pop" 这样的字符串,我可以在大写字符上拆分,但我想要的是在大写上拆分,除非前面有空格。

我尝试将! 添加到:

print (re.findall(r'[A-Z](?:A-Z*(?![a-z])|[a-z]*)',line))

我放置添加的位置没有区别。

【问题讨论】:

  • 你能添加你想要的输出吗?
  • Findall 和 split 是不同的东西。您似乎还想在空格后跟大写字母而不是大写字母上进行拆分。你能举一个输入和输出的例子吗?你可能想要一个像这样的前瞻:tweets_file = open('tweets.txt', "r")),它给出了['aaa', 'BcccDeee qqqq 9.', 'Fggg', 'HiiiJeee']
  • 你的例子,用大写字母分割,前面没有空格是re.split("(?<! )[A-Z]", "Trip HopDowntempoSynth-pop"),结果是['', 'rip Hop', 'owntempo', 'ynth-pop']。我们需要几个示例输入和输出,以便找出各种条件。

标签: python regex split


【解决方案1】:

你的意思是这样的吗?

re.split('\s+(?=[A-Z])', "Trip HopDowntempoSynth-pop")
# ['Trip', 'HopDowntempoSynth-pop']

或者相反:

pattern = re.compile('[A-Z][^A-Z\s]+(?:\s+\S[^A-Z\s]*)*')

pattern.findall("Trip HopDowntempoSynth-pop")
# ['Trip Hop', 'Downtempo', 'Synth-pop']

pattern.findall("Trip Hop HHopDowntempoSynth-pop")
#['Trip Hop H', 'Hop', 'Downtempo', 'Synth-pop']

【讨论】:

  • 我相信他们想要的恰恰相反;您的示例仅拆分那些前面有空格的大写字符。 OP想要拆分所有前面没有空格的大写字符
  • @Hamms 是的,我也添加了相反的内容。
【解决方案2】:

可能是环形交叉路口,但通过迭代 re.findall 和使用 re.sub 将匹配替换为占位符字符,然后拆分...

import re
s = "Trip HopDowntempoSynth-pop"

pattern = re.compile("[a-z][A-Z]")

matches = re.findall(pattern, s)

for match in matches:
    match_replacer = match[0] + '|' + match[1]
    s = s.replace(match, match_replacer)


s.split('|')

给出输出

['Trip Hop', 'Downtempo', 'Synth-pop']

【讨论】:

  • 实际上这假设大写字母必须以小写字母开头,或者可能要使用pattern = re.compile("[^\s][A-Z]")
【解决方案3】:

这不是正则表达式,但很容易解决您的问题。

s = "Trip HopDowntempoSynth-pop"

arr = []
word = s[0]
for i in range(1, len(s)):
    if s[i].isupper():
        if s[i - 1] == " ":
            word += s[i]
        else:
            arr.append(word)
            word = s[i]
    else:
        word += s[i]
arr.append(word)

print(arr)

它打印出一个如下所示的数组:

['Trip Hop'、'Downtempo'、'Synth-pop']

【讨论】:

    猜你喜欢
    • 2019-06-07
    • 2022-12-15
    • 2017-03-20
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 2021-10-07
    • 2022-11-30
    相关资源
    最近更新 更多