gpt4 book ai didi

Python:re.compile 和 re.sub

转载 作者:太空狗 更新时间:2023-10-29 21:14:29 26 4
gpt4 key购买 nike

问题第 1 部分

我得到了这个文件 f1:

<something @37>
<name>George Washington</name>
<a23c>Joe Taylor</a23c>
</something @37>

我想重新编译它,它看起来像这样 f1:(带空格)
George Washington Joe Taylor

我试过这段代码,但它有点删除了所有内容:
import re
file = open('f1.txt')
fixed = open('fnew.txt','w')
text = file.read()

match = re.compile('<.*>')
for unwanted in text:
fixed_doc = match.sub(r' ',text)

fixed.write(fixed_doc)

我的猜测是 re.compile 行,但我不太确定如何处理它。我不应该使用 3rd 方扩展。有任何想法吗?
问题第 2 部分

我有一个关于比较 2 个文件的不同问题我从 Alfe 得到了这个代码:
from collections import Counter

def test():
with open('f1.txt') as f:
contentsI = f.read()
with open('f2.txt') as f:
contentsO = f.read()

tokensI = Counter(value for value in contentsI.split()
if value not in [])
tokensO = Counter(value for value in contentsO.split()
if value not in [])
return not (tokensI - tokensO) and not (set(tokensO) - set(tokensI))

是否可以在“if value not in []”部分中实现 re.compile 和 re.sub?

最佳答案

我将解释您的代码会发生什么:

import re
file = open('f1.txt')
fixed = open('fnew.txt','w')
text = file.read()

match = re.compile('<.*>')
for unwanted in text:
fixed_doc = match.sub(r' ',text)

fixed.write(fixed_doc)

指令 text = file.read()创建一个对象 正文 名为 text 的字符串类型.
请注意,我使用了粗体字符 正文 表达一个对象,和 text表示该对象的名称 == IDENTIFIER。
作为指令 for unwanted in text: 的结果,标识符 unwanted依次分配给 引用的每个字符正文 目的。

此外, re.compile('<.*>')创建一个 RegexObject 类型的对象(我个人称其为已编译)正则表达式或简称为正则表达式, <.*>只是正则表达式模式)。
您将此编译的正则表达式对象分配给标识符 match :这是一个非常糟糕的做法,因为 match通常已经是正则表达式对象的方法的名称,特别是您创建的方法的名称,因此您可以编写 match.match没有错误。 match也是 的函数名回复 模块。
将此名称用于您的特定需求是非常令人困惑的。你必须避免这种情况。

使用 file 也存在同样的缺陷作为文件 f1 的文件处理程序的名称。 file已经是语言中使用的标识符,您必须避免使用它。

好。现在这个臭名昭著的 匹配 对象被定义,指令 fixed_doc = match.sub(r' ',text)替换正则表达式找到的所有出现 匹配 正文 与更换 r' ' .
请注意,写 r' ' 完全是多余的而不仅仅是 ' '因为在 ' ' 中绝对没有任何东西这需要逃脱。每当他们不得不在正则表达式问题中编写字符串时,一些焦虑的人都会编写原始字符串,这是一种时尚。

因为它的图案 <.+>其中点符号表示“贪婪地吃掉位于 <> 之间的每个字符,除非它是换行符”, 在文本中捕获的出现匹配 是每一行直到最后 >在里面。
正如名字 unwanted没有出现在本指令中,它是对文本的每个字符进行的相同操作,一个接一个。也就是说:没什么有趣的。
要分析程序的执行,您应该在代码中放入一些打印指令,以便了解会发生什么。例如,如果你做 print repr(fixed_doc) ,你会看到这样的重复打印: ' \n \n \n ' .正如我所说:没什么有趣的。

您的代码中还有一个默认设置:您打开文件,但不关闭它们。必须关闭文件,否则可能会发生一些奇怪的现象,这是我在意识到需要之前亲自在我的一些代码中观察到的。有些人假装这不是强制性的,但这是错误的。
顺便说一句,打开和关闭文件的更好方法是使用 with陈述。它可以完成所有工作,您无需担心。

.

所以,现在我可以为你的第一个问题提出一个代码:
import re

def ripl(mat=None,li = []):
if mat==None:
li[:] = []
return
if mat.group(1):
li.append(mat.span(2))
return ''
elif mat.span() in li:
return ''
else:
return mat.group()

r = re.compile('</[^>]+>'
'|'
'<([^>]+)>(?=.*?(</\\1>))',
re.DOTALL)

text = '''<something @37>
<name>George <wxc>Washington</name>
<a23c>Joe </zazaza>Taylor</a23c>
</something @37>'''
print '1------------------------------------1'
print text
print '2------------------------------------2'
ripl()
print r.sub(ripl,text)
print '3------------------------------------3'

结果
1------------------------------------1
<something @37>
<name>George <wxc>Washington</name>
<a23c>Joe </zazaza>Taylor</a23c>
</something @37>
2------------------------------------2

George <wxc>Washington
Joe </zazaza>Taylor

3------------------------------------3

原理如下:

当正则表达式检测到标签时,
- 如果是结束标签,则匹配
- 如果是开始标签,则仅当文本中某处有相应的结束标签时才匹配
对于每个匹配,方法 sub()正则表达式 r调用函数 ripl()执行更换。
如果匹配带有开始标记(必须在文本中的某处跟随其相应的结束标记,通过正则表达式的构造),则 ripl()返回 '' .
如果匹配带有结束标记,则 ripl()返回 ''仅当此结束标记之前已在文本中被检测到时,它才是前一开始标记的相应结束标记。这可以通过在列表中记录来实现 每次检测到开始标签并匹配时,每个相应结束标签的跨度的跨度。

录音列表 被定义为默认参数,以便它始终与每次调用函数时使用的列表相同 ripl() (请参阅undertsand 的默认参数的功能,因为它很微妙)。
由于 li 的定义作为接收默认参数的参数,列表对象 将保留分析多个文本时记录的所有跨度,以防连续分析多个文本。为了避免列表 要保留过去文本匹配的范围,必须将列表设为空。我编写了该函数,以便使用默认参数 None 定义第一个参数。 : 允许拨打 ripl()在正则表达式中使用它之前没有参数 sub()方法。
那么,一定要想到写 ripl()在使用它之前。

.

如果您想删除文本的换行符以获得您在问题中显示的精确结果,则必须将代码修改为:
import re

def ripl(mat=None,li = []):
if mat==None:
li[:] = []
return
if mat.group(1):
return ''
elif mat.group(2):
li.append(mat.span(3))
return ''
elif mat.span() in li:
return ''
else:
return mat.group()


r = re.compile('( *\n *)'
'|'
'</[^>]+>'
'|'
'<([^>]+)>(?=.*?(</\\2>)) *',
re.DOTALL)

text = '''<something @37>
<name>George <wxc>Washington</name>
<a23c>Joe </zazaza>Taylor</a23c>
</something @37>'''
print '1------------------------------------1'
print text
print '2------------------------------------2'
ripl()
print r.sub(ripl,text)
print '3------------------------------------3'

结果
1------------------------------------1
<something @37>
<name>George <wxc>Washington</name>
<a23c>Joe </zazaza>Taylor</a23c>
</something @37>
2------------------------------------2
George <wxc>WashingtonJoe </zazaza>Taylor
3------------------------------------3

关于Python:re.compile 和 re.sub,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18457101/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com