【问题标题】:How to insert a newline character before a word(s) that contains a colon [closed]如何在包含冒号的单词之前插入换行符[关闭]
【发布时间】:2018-09-15 01:52:36
【问题描述】:

我有一个全是一行的字符串,例如:

Breed: Pembroke Welsh Corgi Price: $2,200 Gender: Female Nickname: Koko 
Age: 9 Weeks Old Color/Markings: yellow and white Size at Maturity: 
Medium Availability Date: 09/30/2018 Shipping Area: Worldwide Payment 
Method: Money Order/Cashier's Check, Paypal, Credit Cards, Cash

我希望输出是:

Breed: Pembroke Welsh Corgi
Price: $2,200
Gender: Female
Nickname: Koko

等等。等等。基本上在以冒号结尾的新类别之前插入一个\n

感谢您提前回复!

【问题讨论】:

  • 您确定在每个包含冒号的单词之前都需要一个换行符吗?因为有 Availability Date:Shipping Area: 这样的情况,在冒号的单词前添加换行符可能不会得到预期的结果。
  • @Austin 你是对的,有什么办法可以按照我的方式去做吗?对不起,我还是个新手。
  • 作为一个人而不是一台计算机,您将如何直观地做到这一点?这可能会帮助您找到合适的条件。
  • 您有属性名称列表吗?拥有这样的清单将大大简化问题。

标签: python string python-3.x split newline


【解决方案1】:

为什么没有人提出正则表达式解决方案? :)

import re
txt = '''your text'''
re.sub(r'(\w+):', r'\n\1:', txt).strip()

如果原始txt 中有换行符,您最终可能会在输出中出现双换行符。它们可以轻松移除:

re.sub(r'\n\n', r'\n', # Remove double line breaks
       re.sub(r'(\w+):',r'\n\1:',txt).strip())

此方案假定冒号前只有一个感兴趣的词。 事实上,可能无法决定如何拆分“Shipping Area: Worldwide Payment Method: Money” '。是 'Shipping Area: Worldwide' 和 'Payment Method: Money' 还是 'Shipping Area: Worldwide Payment' 和 'Method: Money'?

【讨论】:

  • “为什么没有人提出正则表达式解决方案?”。原因是在: 之前可以有任何(+)个单词,在这之前你需要一个\n。请参阅我对问题的评论。
  • @Austin 我看到了你的评论。但是你看到我帖子的最后一行了吗?
  • 是的,我确实看到了。我正在回答你的具体问题:“怎么会......”;)但是这个并不能完全帮助 OP。
  • @Austin 到目前为止,所有个答案都做出了这个假设。我怀疑是否有可能在不使用某种 NLP 的情况下回答所提出的问题。因此,正则表达式解决方案并不比任何其他解决方案差。
【解决方案2】:

正如 Austin 上面指出的,有些类别是短语而不是单词。没有简单的方法可以将“成熟时的黄色和白色大小”之类的内容分开来确定换行符的位置。因此,您需要提前列出所有可能类别的详尽列表。如果你能提供,有很多方法可以做到这一点。这是一个简单的:

s = "Breed: Pembroke Welsh Corgi Price: $2,200 Gender: Female Nickname: Koko Age: 9 Weeks Old Color Markings: yellow and white Size at Maturity: Medium Availability Date: 09/30/2018 Shipping Area: Worldwide Payment Method: Money Order/Cashier's Check, Paypal, Credit Cards, Cash"

categories = ['Breed', 'Price', 'Gender:', 'Nickname', 'Age', 'Color/Markings',
              'Size at Maturity', 'Availability Date', 'Shipping Area',
              'Payment Method']

for cat in categories:
    s = s.replace(cat + ':', '\n' + cat + ':')

print(s)

如果可能的话,最好修复生成此数据的任何内容,以便它首先具有适当的分隔符。

【讨论】:

  • pastebin.com/X1a4cdm6 是的,类别总是相同的,我想我最喜欢你的方法。虽然,当我这样做时,这就是我得到的。第一个字符串是原始字符串,第二个字符串是输出。
  • 这是因为 for 循环删除了所有以前的替换,只留下最后一个,即付款方式。我将如何解决这个问题?谢谢
  • 它不应该,并且在 python3 中对我来说很好。 s 会被循环中对 s.replace 的每次调用覆盖,并累积更改。
  • 我的解决方案还会在字符串中插入一个空的第一行,因此如果这很重要,您可能需要在循环之后添加一个 s = s.lstrip()
  • 另外,for 是使用reduce 的绝佳候选者。类似output_str = reduce(lambda s, cat: s.replace(cat + ':', '\n' + cat + ':'), categories, input_str)
【解决方案3】:

不可能将多个单词类别与产生它们的值区分开来,但假设您可以将自己限制为单个单词类别,您可以使用以下内容:

import sys
data = "Breed: Pembroke Welsh Corgi Price: $2,200 Gender: Female Nickname: Koko"
words = data.split(' ')
for word in words:
    if word.endswith(':'):
        sys.stdout.write("\n"+word)
    else:
        sys.stdout.write(" "+word)
sys.stdout.write("\n")

产生输出:

Breed: Pembroke Welsh Corgi
Price: $2,200
Gender: Female
Nickname: Koko

【讨论】:

  • 你读过我对这个问题的评论了吗?
  • 是的,因此是第一句话。
  • 你在开头输出了一个额外的换行符
【解决方案4】:
kk = 'Breed: Pembroke Welsh Corgi Price: $2,200 Gender: Female Nickname: Koko Age: 9 Weeks Old Color/Markings: yellow and white Size at Maturity: Medium Availability Date: 09/30/2018 Shipping Area: Worldwide Payment Method: Money Order/Cashier\'s Check, Paypal, Credit Cards, Cash'
kk_a = [ '\n'+k if k.endswith(':') else ' '+k for k in kk.split() ]
print(''.join(kk_a))

希望有帮助

以上代码的结果

Breed: Pembroke Welsh Corgi
Price: $2,200
Gender: Female
Nickname: Koko
Age: 9 Weeks Old
Color/Markings: yellow and white Size at
Maturity: Medium Availability
Date: 09/30/2018 Shipping
Area: Worldwide Payment
Method: Money Order/Cashier's Check, Paypal, Credit Cards, Cash

【讨论】:

  • 它说 kk_a 没有定义
  • 错字.. 已经修复了
  • 你读过我对这个问题的评论吗?
  • 是的,原来的问题有点令人困惑。
  • 您在开头添加了一个额外的换行符
【解决方案5】:

使用.split() 将字符串拆分为单词。然后,遍历每个单词,并使用word[-1] 检查单词是否以冒号结尾。如果是,则在单词的开头插入\n 字符。

【讨论】:

  • OP 从字面上询问如何做到这一点。这是在命令式中对问题的重述,而不是答案。有点像做“只是做”
  • OP 没有提到任何关于知道.split() 方法或访问单词的最后一个字符的内容。也许我可以更好地指定“插入\n 字符”部分,但这是一个简单的谷歌搜索,我发现仅仅为他们写答案并没有帮助。除了寻求帮助之外,学习如何自给自足是最有益的。
猜你喜欢
  • 2021-02-22
  • 1970-01-01
  • 2015-01-08
  • 1970-01-01
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
相关资源
最近更新 更多