我有很长的文本,其中包含数据名称等。假设数据是这样的:
[espacios]Elnombre1[espacios](237)
[espacios]Elnombre3(237)
[espacios]Elnombre4(17)
我只需要得到名字。通常,名称前后都有空格,最后是括号和数字。
另外,我需要在括号内添加一些文本(任何文本都可以)。
预期结果:
nombremio123textoquepuse(losparentesis)
我试过:
with open("e.txt", 'r+') as f:
texto = re.sub('^\s+([a-zA-Z-0-9]+)\s*', f.read())
f.seek(0)
f.write(texto)
f.truncate()
通过读取文本文件并用正确的数据重写它有什么可能的方法吗?
一个主意。用括号分割行,然后将
strip
第一个元素设为 a,以消除它在开头和结尾可能有的空格。即:出来
更新
要处理文件,如果行数不是很大,一种方法是先读取它,处理这些行并将结果累积在一个列表中,然后再写入。
这种方法的缺点是您必须在写入之前将结果保存在内存中。这不应该是一个问题,除非文件是可怕的,但如果它是一个问题,那么最好打开两个文件(用于读取的原始文件和用于写入的结果)并在处理它们时写入行而不是存储他们在一个列表中。最后,一旦文件关闭,您可以重命名输出文件并将其命名为与输入相同的名称。
更新 2
在该问题的后续版本中,要求提取括号中的内容并添加额外文本(我理解为前缀)的可能性。
对于这种类型的处理,最好构建一个正则表达式来捕获感兴趣的行的不同部分。然而,众所周知,正则表达式是一个敏感的主题,并且已经有另一个答案显示了如何使用它们,所以我将在这里展示“手工”解决方案(尽管它不是我一般推荐的解决方案)。
要提取括号内的内容,我们可以利用我们已经将行除以 的事实
(
,因此[1]
该行的其余部分将在元素中。只需删除最后一个字符(将是)
)即可获得括号内的内容。即:使用正则表达式获取名称的一种方法可能如下:
结束输出:
解释
正则表达式的
参考^\s+([a-zA-Z-0-9]+)\s*
作用是查找以\s
至少一次开头的空格字符,以字母或数字继续(括号 () 允许捕获名称),然后再跟*
零个或多个空格字符\s
。替换捕获部分文本
举个例子:
所以,从文本的开头
^
,可选的空格*
,任意数量的字符.*?
,可选的空格,带数字的括号\(\d+\)
和文本的结尾$
。我在最后使用
.*?
with?
来告诉它“尽可能少地”匹配。这是一个惰性量词。通过这种方式,它不会占用名称后面的空格。在同一个结构中,我使用了一个点 (
.
),它匹配除换行符以外的任何字符,但您可以完全将其限制为您想要的任何字符,例如:[\w .,;!áéíóúüñ]*?
或除空格之外的任何字符[^ ]*?
等。我们要做的是获取名称。在正则表达式中使用括号时,会捕获并保存匹配的文本,以便可以在替换中使用文本,使用
\1
.正则表达式:
替代品:
otrotexto
它不应该有\
s (或者你应该将它们转义为\\
)。代码:
结果:
示范:
https://ideone.com/s16Wrx
用
_
要转换
"El nombre 1 (237)"
为,"El_nombre_1(otrotexto)"
我们使用函数作为 re.sub() 的参数。让我们使用一个 lambda。