如何从列表字符串中提取第一个换行符(\n)后的目标内容?
问题:提取字符串中第一个换行符后的名称
我有两个列表:
list_1 = ['08667\nST 403', '08667\nST 403', '08667\nST 403'] list_2 = ['12233\nFION', '12233\nFION', '12233\nFION', '12233\nFION', '31147\nARAB\nP1454']
希望提取每个元素中第一个换行符(\n)后的名称,但当前代码处理list_2最后一个元素时,提取出的是P1454而非期望的ARAB。
原代码
def parse_string(string): string = string.rsplit('\n', 1)[1] return string list_1 = ['08667\nST 403', '08667\nST 403', '08667\nST 403'] list_2 = ['12233\nFION', '12233\nFION', '12233\nFION', '12233\nFION', '31147\nARAB\nP1454'] new_list_1 = [] new_list_2 = [] for i in range(len(list_1)): new_list_1.append(parse_string(list_1[i])) for i in range(len(list_2)): new_list_2.append(parse_string(list_2[i]))
问题现象
- 处理
list_1结果符合预期:
new_list_1 ['ST 403', 'ST 403', 'ST 403']
- 处理
list_2时结果不符合预期:
new_list_2 ['FION', 'FION', 'FION', 'FION', 'P1454']
解决方案
问题出在rsplit('\n', 1):这个方法会从字符串末尾开始分割,取最后一个换行符后的内容,而你需要的是第一个换行符后、第二个换行符前的内容(如果存在多个换行)。
方法1:使用split仅分割一次
这是最简洁的方式,split('\n', 1)只会分割第一次出现的换行符,直接取分割后的第二个元素:
def parse_string(string): return string.split('\n', 1)[1]
方法2:通过索引切片取值
如果需要更精准地控制截取范围,可以通过查找换行符的索引来切片:
def parse_string(string): first_nl = string.index('\n') second_nl = string.find('\n', first_nl + 1) if second_nl != -1: return string[first_nl+1 : second_nl] else: return string[first_nl+1:]
修改后运行代码,new_list_2的结果会变为:
['FION', 'FION', 'FION', 'FION', 'ARAB']
另外,遍历列表可以用更简洁的列表推导式替代原有的for循环:
new_list_1 = [parse_string(item) for item in list_1] new_list_2 = [parse_string(item) for item in list_2]
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

