无需正则表达式,如何按shiftdate拆分Python字符串?
问题:拆分以"shiftdate"开头的字符串片段
给定包含重复标识的长字符串:
sampleString = "shiftdate_154_04-01-2024@scode_154_AAA@shiftstart_154_0000@shiftend_154_2400@eligdate_154_04-01-2024@forfdate_154_04-01-2024@payoutdate_154_04-01-2024@payoutscode_154_AA59@schedhol_154_Y@scheddate_154_@autosched_154_Y@autoscheddate_154_@shiftdate_155_@scode_155_AACT@shiftstart_155_0000@shiftend_155_2400@eligdate_155_@forfdate_155_@payoutdate_155_@payoutscode_155_155_AA59@schedhol_155_ @scheddate_155_@autosched_155_ @autosched_155date_155_"
需要将其拆分为以"shiftdate"开头的元素列表,预期结果:
result_list = [ "shiftdate_154_04-01-2024@scode_154_AAA@shiftstart_154_0000@shiftend_154_2400@eligdate_154_04-01-2024@forfdate_154_04-01-2024@payoutdate_154_04-01-2024@payoutscode_154_AA59@schedhol_154_Y@scheddate_154_@autosched_154_Y@autoscheddate_154_@", "shiftdate_155_@scode_155_AACT@shiftstart_155_0000@shiftend_155_2400@eligdate_155_@forfdate_155_@payoutdate_155_@payoutscode_155_155_AA59@schedhol_155_ @scheddate_155_@autosched_155_ @autosched_155date_155_" ]
尝试使用split()函数会移除"shiftdate"标识,询问可行的Python方法,以及在"shiftdate"前插入逗号再拆分是否可行。
解决方案
方法一:使用正则表达式(推荐)
Python的re库可以直接匹配所有以"shiftdate"开头的连续片段,直到下一个"shiftdate"出现或字符串结束。用re.findall()即可实现:
import re sampleString = "shiftdate_154_04-01-2024@scode_154_AAA@shiftstart_154_0000@shiftend_154_2400@eligdate_154_04-01-2024@forfdate_154_04-01-2024@payoutdate_154_04-01-2024@payoutscode_154_AA59@schedhol_154_Y@scheddate_154_@autosched_154_Y@autoscheddate_154_@shiftdate_155_@scode_155_AACT@shiftstart_155_0000@shiftend_155_2400@eligdate_155_@forfdate_155_@payoutdate_155_@payoutscode_155_155_AA59@schedhol_155_ @scheddate_155_@autosched_155_ @autosched_155date_155_" # 正则规则:匹配shiftdate开头,非贪婪匹配到下一个shiftdate或字符串结尾 result = re.findall(r'shiftdate.*?(?=shiftdate|$)', sampleString, re.DOTALL) print(result)
规则解释:
shiftdate:精准匹配起始标识.*?:非贪婪模式匹配任意字符(re.DOTALL确保匹配换行符)(?=shiftdate|$):正向预查,遇到下一个shiftdate或字符串结尾时停止,不会消耗该标识
方法二:插入分隔符后拆分(可行)
你提到的在"shiftdate"前插入逗号再拆分的思路是可行的,步骤如下:
- 仅在非字符串开头的"shiftdate"前插入分隔符(比如逗号)
- 按分隔符拆分字符串
- 拆分后的元素自动保留"shiftdate"开头的完整片段
代码示例:
import re sampleString = "shiftdate_154_04-01-2024@scode_154_AAA@shiftstart_154_0000@shiftend_154_2400@eligdate_154_04-01-2024@forfdate_154_04-01-2024@payoutdate_154_04-01-2024@payoutscode_154_AA59@schedhol_154_Y@scheddate_154_@autosched_154_Y@autoscheddate_154_@shiftdate_155_@scode_155_AACT@shiftstart_155_0000@shiftend_155_2400@eligdate_155_@forfdate_155_@payoutdate_155_@payoutscode_155_155_AA59@schedhol_155_ @scheddate_155_@autosched_155_ @autosched_155date_155_" # 在非开头的shiftdate前插入逗号 modified_str = re.sub(r'(?<!^)shiftdate', r',shiftdate', sampleString) # 按逗号拆分得到结果 result = modified_str.split(',') print(result)
规则解释:
(?<!^)shiftdate:反向预查,确保只给不是字符串开头的"shiftdate"添加前缀逗号,避免第一个元素前出现空字符串
内容的提问来源于stack exchange,提问作者JThao
相关产品推荐
相关产品推荐

