【问题标题】:How to split string at a specific char(set of chars, actually), but with specified length如何以特定的字符(实际上是一组字符)拆分字符串,但具有指定的长度
【发布时间】:2011-07-02 16:02:59
【问题描述】:

我很确定有这样的问题..

这就是问题所在 - 我想拆分一个字符串,使用一些指定的字符作为分隔符,但我也希望子字符串的长度接近指定值。


真实世界示例 - 拆分长字幕行。

例子:

1234,asd dsa qwerty 567,

我想将行拆分为最大长度的行,比如说 10,但我不想“拆分”单词。所以,这应该变成:

1234,asd
dsa qwerty 
567, 

当然,我可以通过分隔符拆分行,然后再次将它们连接起来,直到达到所需的长度,但这会非常慢。

我考虑过使用str.find(并使用返回的位置),但它不能与正则表达式一起使用(因为不同的分隔符 - .,;\n、@987654328 @, ETC。)。

我想到了re.findall,但我想不出一个正则表达式。我想到了类似的东西

(.*){, max_len}\s

使用re.S,但它显然不起作用。应该有一些棘手的方法..

【问题讨论】:

  • 我的意思是它与我想匹配的不匹配。我猜这是因为{ , max_len } 匹配整个组的重复。

标签: python string split delimiter


【解决方案1】:
In [1]: import textwrap

In [2]: textwrap.wrap('1234,asd dsa qwerty 567,', 10)
Out[2]: ['1234,asd', 'dsa qwerty', '567,']

【讨论】:

  • 但是这样,如果你使用5作为分割的长度,你会得到子字符串dsa qwerty,它们会分割单词qwerty
  • 如果你将break_long_words=False 传递给textwrap.wrap,它不会跨行断字。
【解决方案2】:

以下代码在宽度为 10 的空格处根据需要拆分您的字符串:

import re
r = "1234,asd dsa qwerty 567,"
p = re.compile("(.{,10})($|\s)")
r = p.sub("\\1\n", r)

在这种情况下,它会产生输出

1234,asd
dsa qwerty
567,

当以宽度 5 分割时,您会得到

1234,asd
dsa
qwerty
567,

你可以看到,这个方法永远不会分割单词。

如果您喜欢其他分隔符,只需将“\s”替换为所需的正则表达式即可。

【讨论】:

  • 哈,现在我看到了你的编辑——是的,我可以在这里使用[delimiters],而不仅仅是\s,我还可以使用不同的“新行字符”,而不仅仅是\n。很棒(:
  • 嗯,不……很有趣。这比我想要的分裂更多。 s = "asd asd" 会被拆分,没必要。你知道如何解决这个问题吗?
  • 我现在的做法是 - 使用splitlines,因为字符串可能不止在线,然后遍历行并使用此拆分。然后使用''.join,但这又很慢。更好的主意?
  • @Kiril Kirov 您也可以使用 "(.{,10})($|\s)" 来正确处理这种情况。
猜你喜欢
  • 1970-01-01
  • 2021-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多