Python提取变量amoun的每行regex匹配

2024-04-26 10:35:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图挑出某些正则表达式匹配项,并将它们作为字符串打印到另一个文件中。你知道吗

我有这样的输入行:

Example one A;B;C;D;E
Example two FF;EE;WW;DFG;E;J
Example three C;UFT;B;VB

我想要这样的输出:

Example one 1:A 2:B 3:C 4:D 5:E
Example two 1:FF 2:EE 3:WW 4:DFG 5:E 6:J
etc

我要查找的元素只有大写字母,用半列分隔,没有空格,行尾用\n,元素范围从至少一个到多个,它们可以由一个字母或多个字母组成

我已经做了这么多了

def read_file(file_name):
    with open(file_name, "r", encoding="utf-8") as pro_file:
        for line in pro_file:
                matches = re.findall('([A-Z]+[;,\n])', line, re.DOTALL)
                counter = len(matches)
                for element in matches:
                    new_matches = re.findall('[A-Z]+', element, re.DOTALL)
                    print(new_matches)

这给了我所有的帽子。整个文件中的字母元素单独作为单个项目列表。我觉得我偏离了轨道。。。我如何利用我目前所得到的来达到期望的输出?还是有更干净、更简单的方法?我在想,也许我可以用counter变量提供的数字来分割输出?你知道吗

目前产量:

['A']
['B']
['C']
etc

Tags: 文件namere元素example字母etcone
1条回答
网友
1楼 · 发布于 2024-04-26 10:35:38

让我们以输入的第一行为例,检查现有代码的功能。你知道吗

for line in pro_file:

line'Example one A;B;C;D;E\n'

    matches = re.findall('([A-Z]+[;,\n])', line, re.DOTALL)

现在matches['A;', 'B;', 'C;', 'D;', 'E\n']

    counter = len(matches)

counter设置为5

    for element in matches:

以第一个元素为例,它将element设置为'A;'

        new_matches = re.findall('[A-Z]+', element, re.DOTALL)

现在new_matches'A;'中所有大写字母的迭代器。有一次这样的跑步。你明白为什么new_matches总是一个元素的列表吗?你知道吗

您可能应该做的不是遍历matches并单独处理每个元素,而是对matches的每个元素应用一个转换,这可以通过生成器表达式来完成。继续上面的例子,我们将matches作为['A;', 'B;', 'C;', 'D;', 'E\n']。对于每个element,可以提取只有大写字母的部分

re.match('[A-Z]+', element).group()

可以使用enumerate()获得(number,match)元组的迭代器。你知道吗

enumerate(re.match('[A-Z]+', element.group() for element in matches))

仔细看看这是做什么,以确保你明白。它遍历matches中的每个element,因为每个matches提取前导大写字母,并将每个字母与一个数字配对。(它是一个生成器,因此如果您试图打印它,则需要首先将其转换为列表或其他内容,否则您将不会得到特别有用的输出。)

然后,对于每个元组,可以使用

('{}:{}'.format(number + 1, letters) for number, letters in enumerate(...))

最后,使用' '.join()将所有这些与空格连接起来。把它们放在一起

' '.join(
    '{}:{}'.format(number + 1, letters) for number, letters in
    enumerate(re.match('[A-Z]+', element.group() for element in matches))
)

然后你必须重新连接第一部分的线。你知道吗

更好的方法

这或多或少是修复现有代码的最小方法。但实际上,我只会使用split()(或rsplit(),从右边开始):首先在空格上打断行,然后在分号上打断最后一个组件。你知道吗

words = line.rsplit(maxsplit=1)
words[0] + ' ' + ' '.join(
    '{}:{}'.format(n + 1, l) for n, l in enumerate(words[-1].split(';'))
)

相关问题 更多 >