我试图挑出某些正则表达式匹配项,并将它们作为字符串打印到另一个文件中。你知道吗
我有这样的输入行:
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
让我们以输入的第一行为例,检查现有代码的功能。你知道吗
line
是'Example one A;B;C;D;E\n'
现在
matches
是['A;', 'B;', 'C;', 'D;', 'E\n']
counter
设置为5以第一个元素为例,它将
element
设置为'A;'
现在
new_matches
是'A;'
中所有大写字母的迭代器。有一次这样的跑步。你明白为什么new_matches
总是一个元素的列表吗?你知道吗您可能应该做的不是遍历
matches
并单独处理每个元素,而是对matches
的每个元素应用一个转换,这可以通过生成器表达式来完成。继续上面的例子,我们将matches
作为['A;', 'B;', 'C;', 'D;', 'E\n']
。对于每个element
,可以提取只有大写字母的部分可以使用
enumerate()
获得(number,match)元组的迭代器。你知道吗仔细看看这是做什么,以确保你明白。它遍历
matches
中的每个element
,因为每个matches
提取前导大写字母,并将每个字母与一个数字配对。(它是一个生成器,因此如果您试图打印它,则需要首先将其转换为列表或其他内容,否则您将不会得到特别有用的输出。)然后,对于每个元组,可以使用
最后,使用
' '.join()
将所有这些与空格连接起来。把它们放在一起然后你必须重新连接第一部分的线。你知道吗
更好的方法
这或多或少是修复现有代码的最小方法。但实际上,我只会使用
split()
(或rsplit()
,从右边开始):首先在空格上打断行,然后在分号上打断最后一个组件。你知道吗相关问题 更多 >
编程相关推荐