首页 > 解决方案 > Python,解析多行字符串提取字符和数字子字符串

问题描述

这是我上一个问题的后续,我更清楚地发现了问题,我需要一些进一步的建议:)

我有一个字符串,由一些机器学习算法产生,它通常具有以下结构:

像这样的东西:

Connery  3 5 7 @  4
>> R. Moore 4 5 67| 5 [

我需要提取 2 个名称和数字字符,并检查其中一行是否以特殊字符开头,所以我的输出应该是:。

name_01 = 'Connery'
digits_01 = [3, 5, 7, 4]
name_02 = 'R. Moore'
digits_02 = [4, 5, 67, 5]
selected_line = 2 (anything indicating that it's the second line)

在链接的原始问题中,有人建议我使用:

inp = '''Connery  3 5 7 @  4
    >> R. Moore 4 5 67| 5 ['''
lines = inp.split('\n')
for line in lines:
    matches = re.findall(r'\w+', line)
    print(matches)

这产生的结果非常接近我想要的:

['Connery', '3', '5', '7', '4']
['R', 'Moore', '4', '5', '67', '5']

但是我需要将第二行中的前两个字符串('R','Moore')组合在一起(基本上,在数字开始之前将所有字符组合在一起)。并且,它跳过了特殊字符的检测。我应该以某种方式修复此输出,还是可以完全以不同的方式解决问题?

标签: pythonstringtext-parsing

解决方案


我不确定您希望保留或删除哪些字符,但类似以下内容应该适用于该示例:

inp = '''Connery  3 5 7 @  4
    >> R. Moore 4 5 67| 5 ['''
lines = inp.split('\n')
for line in lines:
    matches = re.findall(r'(?:[a-zA-Z.][a-zA-Z.\s]+[a-zA-Z.])|\w+', line)
    print(matches)

输出:

['Connery', '3', '5', '7', '4']
['R. Moore', '4', '5', '67', '5']

注意。我包括a-z(下和上)和点,中间有可选空格:[a-zA-Z.][a-zA-Z.\s]+[a-zA-Z.],但你应该根据你的实际需要进行更新。


推荐阅读