【问题标题】:Specifying rules for splitting strings Python指定分割字符串 Python 的规则
【发布时间】:2019-09-30 13:30:29
【问题描述】:

我正在尝试将一个句子拆分为三个不同的变量以供以后使用,并且我需要指定一些规则以按照我需要的方式拆分它。

例句:

sentence = 'SUPER Jumper Colour BROWN-8'

由此我需要三个变量

textBeforeColour = 'SUPER Jumper Colour'
Colour = 'BROWN'
Size = '8'

PS。颜色 (BROWN-8) 将始终为大写字母 颜色(BROWN-8)之前的任何内容都可能有一些大写字母,但不是全部。

我已经创建了一个可以做到这一点的脚本,但我知道如果文本稍有变化,脚本就会中断。例如

import re
text = 'SUPER Jumper Colour BROWN-8'
list = text.split()
myList = []
lastWord = list[-1]

for iterating_var in list:
   if iterating_var is not list[-1]: #THIS GIVES ME THE 'BEFORE COLOUR' TEXT
        myList.append(iterating_var)

if lastWord == 'SIZE':
     print('ONE SIZE') #This is used when the Size is not a number but comes as ONE SIZE
else:
    splitText = re.split('-',lastWord)
    print(splitText[0])
    print(splitText[1])
    Colour = splitText[0]
    size = splitText[1]

现在这一切都奏效了。但如果字符串将使用颜色:LIGHT BLUE - 此脚本将使用句子变量而不是颜色变量保留“LIGHT”。

【问题讨论】:

  • 对原始问题的小修改。我意识到有些句子可能以字母大小结尾,例如(SUPER Jumper Color BROWN-S)或在某些情况下(SUPER Jumper Color BROWN-S/M)。 - 有谁知道可能如何让这条规则参与进来? @帕特里克

标签: python-3.x string split


【解决方案1】:
import re
text = "blah Blah LIGHT BLUE-8"

if text.split()[-1] == "SIZE":
    print("ONE SIZE")
else:
    colour = re.findall("([A-Z ]+)-[0-9]$", text)[0][1:]
    print(colour)
    size = int(re.findall("[0-9]+$", text)[0])
    print(size)
    sentence = re.findall("(.*[^A-Z ])[A-Z ]+-[0-9]$", text)[0]
    print(sentence)

对于颜色:零个或多个大写字母和空格的序列,后跟连字符、零个或多个数字以及字符串的结尾

对于大小:字符串末尾的零个或多个数字

对于句子:零个或多个字符,然后是一个不是大写字母或空格的字符,然后是颜色的图案

【讨论】:

  • 完美!!谢谢你。简单的后续问题 - 是否有关于 re.findall/split 等的手册 - 我可以在其中查找这些命令的一部分的类?
  • 很高兴我能帮上忙 :) 这里有一个很好的列表:w3schools.com/python/python_regex.asp
  • 知道了,我会进一步研究它们 - 再次感谢!
【解决方案2】:

您应该能够在一个带有捕获组的正则表达式中执行此操作:

import re

pat = re.compile(r'^([\w\s]+?)\s+([A-Z\s]+)-(\d+)$')

sentence = 'SUPER Jumper Colour LIGHT BLUE-88'

match = pat.match(sentence)
if match:
    text, color, number = match.groups()
    print(text)    # SUPER Jumper Colour
    print(color)   # LIGHT BLUE
    print(number)  # 88

正则表达式功能强大,但可能会变得复杂。如果您对它们不熟悉,here is the documentation for the re module

【讨论】:

  • 也像魅力一样工作 - 感谢您的帮助。我会查看文档,因为它确实看起来很复杂!
  • 嗨。对原始问题的小修改。我意识到有些句子可能以字母大小结尾,例如(SUPER Jumper Color BROWN-S)或在某些情况下(SUPER Jumper Color BROWN-S/M)。 - 你知道如何整合这些变化吗?
  • 您可以尝试更改最终捕获组 (\d+) 以捕获所有字符:(.+)。
  • 谢谢你做到了。最后一个问题。我刚刚看到有些句子有多个连字符 (-),例如'超酷跳线 BROWN-S'。发生这种情况时,脚本不会产生任何结果。
  • 您可以在第一个字符类中添加连字符以使其也可以接受:^([\w\s-]+?)\s+([A-Z\s]+)-(\d+)$
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
  • 2017-03-25
  • 2021-06-12
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
相关资源
最近更新 更多