按字母拆分Python字符串并保留分隔符

时间:2019-11-04 18:24:03

标签: python regex

使用正则表达式,如何分割字符串并将其分隔符保留在返回的结果中?我正在尝试将包含数字和字符串的字符串除以一组字母,然后再加上任何包含“。”的数值。但是它似乎无法正常工作。

下面是我的测试字符串,即时消息使用的是python 2.7,它没有产生预期的ID。

s = 'M160.394,83.962L121.5,52L86.31,73.378L58,104.917L89.75,C136.667L158.542,136.667L185,110.208L160.394,83.962Z'
parts = filter(None, re.split('([MLHVCSQTAZ][^MLHVCSQTAZ]+)', s, re.IGNORECASE))
print len(parts), parts
>>> 3 ['M160.394,83.962', 'L121.5,52', 'L86.31,73.378L58,104.917L89.75,C136.667L158.542,136.667L185,110.208L160.394,83.962Z']

我希望它能给我

>>> 10 ['M160.394,83.962', 'L121.5,52', 'L86.31,73.378', 'L58,104.917', 'L89.75,', 'C136.667', 'L158.542,136.667', 'L185,110.208', 'L160.394,83.962', 'Z']

它应该输出一个字符串列表,其中每个字符串都以一个字母开头,该字符串可以在原始正则表达式MLHVCSQTAZ中找到

3 个答案:

答案 0 :(得分:5)

在您的代码中,您将re.IGNORECASE作为第三个参数传递给re.split,但是3rd argument of re.split is maxsplit not flags.

re.IGNORECASE等于2,因此您的输入仅被拆分两次。

您可以使用:

>>> list(filter(None, re.split(r'([MLHVCSQTAZ][^MLHVCSQTAZ]+)', s, 0, re.I)))
['M160.394,83.962', 'L121.5,52', 'L86.31,73.378', 'L58,104.917', 'L89.75,', 'C136.667', 'L158.542,136.667', 'L185,110.208', 'L160.394,83.962', 'Z']

或使用内联模式忽略大小写:

re.split(r'(?i)([MLHVCSQTAZ][^MLHVCSQTAZ]+)', s)

我建议使用简单的re.findall代码,该代码使用几乎相同的正则表达式:

parts = re.findall('(?i)[MLHVCSQTAZ][^MLHVCSQTAZ]*', s)

参考SRE_FLAG_IGNORECASE = 2中的lib/python2.7/sre_constants.py(感谢@vks的评论)

答案 1 :(得分:3)

您可以使用re.findall

import re
s = 'M160.394,83.962L121.5,52L86.31,73.378L58,104.917L89.75,C136.667L158.542,136.667L185,110.208L160.394,83.962Z'
result = re.findall('[A-Z][\.\d,]+|[A-Z]', s)

输出:

['M160.394,83.962', 'L121.5,52', 'L86.31,73.378', 'L58,104.917', 'L89.75,', 'C136.667', 'L158.542,136.667', 'L185,110.208', 'L160.394,83.962', 'Z']

答案 2 :(得分:3)

parts = filter(None, re.split('([MLHVCSQTAZ][^MLHVCSQTAZ]+)', s, flags=re.IGNORECASE))

您需要使用flags。检查re.split函数定义。

默认re不支持0 width assertion split。因此,您也可以使用regex模块。

import regex
s = 'M160.394,83.962L121.5,52L86.31,73.378L58,104.917L89.75,C136.667L158.542,136.667L185,110.208L160.394,83.962Z'
print regex.split('(?=[MLHVCSQTAZ][^MLHVCSQTAZ])', s, flags=regex.IGNORECASE|regex.VERSION1)