GVKun编程网logo

Python正则表达式中的错误?(带有re.MULTILINE的re.sub)(python re 正则)

14

在本文中,您将会了解到关于Python正则表达式中的错误?的新资讯,同时我们还将为您解释带有re.MULTILINE的re.sub的相关在本文中,我们将带你探索Python正则表达式中的错误?的奥秘,

在本文中,您将会了解到关于Python正则表达式中的错误?的新资讯,同时我们还将为您解释带有re.MULTILINE的re.sub的相关在本文中,我们将带你探索Python正则表达式中的错误?的奥秘,分析带有re.MULTILINE的re.sub的特点,并给出一些关于JAVA正则表达式中MULTILINE怎么用、Python 2.7.1的re模块中带有re.split函数和re.DOTALL标志的错误、Python re.sub multine 文本、python 正则表达式 re.sub & re.subn的实用技巧。

本文目录一览:

Python正则表达式中的错误?(带有re.MULTILINE的re.sub)(python re 正则)

Python正则表达式中的错误?(带有re.MULTILINE的re.sub)(python re 正则)

我注意到Python的Regex库中有些奇怪的行为,而且我不确定自己是否做错了什么。

如果我使用re.sub()配合对其运行正则表达式re.MULTILINE。它似乎仅替换前几次出现的情况。如果我关闭re.MULTILINE,使用re.subn(...,count = 0, flags = re.MULTILINE)或编译正则表达式,它将替换所有出现的情况re.compile(...,re.MULTILINE)

我在Ubuntu 12.04上运行Python 2.7。

我在以下位置发布了一个随机示例:

  • Pastebin.com-终端输出
  • 键盘-确认行为的脚本(re.subn()除外,在2.5上有所不同)

有人可以确认/拒绝其计算机上的这种行为吗?

编辑:意识到我应该继续并将其发布在Python错误跟踪器上。编辑2:报告的问题:http
//bugs.python.org/msg168909

答案1

小编典典

采用

re.sub(pattern, replace, text, flags=re.MULTILINE)

代替

re.sub(pattern, replace, text, re.MULTILINE)

相当于

re.sub(pattern, replace, text, count=re.MULTILINE)

这是您代码中的错误。

参见re.sub()

JAVA正则表达式中MULTILINE怎么用

JAVA正则表达式中MULTILINE怎么用

api中描述:^字符匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与"\n"或"\r"之后的位置匹配。

我理解下面的程序应该返回true,却返回了false,why?

Pattern p = Pattern.compile("^a.*", Pattern.MULTILINE);
Matcher m = p.matcher("\r\nab");
System.out.println(m.matches());

Python 2.7.1的re模块中带有re.split函数和re.DOTALL标志的错误

Python 2.7.1的re模块中带有re.split函数和re.DOTALL标志的错误

我有一台运行Lion和Python 2.7.1的Mac。我注意到re模块中有些非常奇怪的东西。如果我运行以下行:

print re.split(r''\s*,\s*'', ''a, b,\nc, d, e, f, g, h, i, j, k,\nl, m, n, o, p, q, r'')

我得到这个结果:

[''a'', ''b'', ''c'', ''d'', ''e'', ''f'', ''g'', ''h'', ''i'', ''j'', ''k'', ''l'', ''m'', ''n'', ''o'', ''p'', ''q'', ''r'']

但是,如果我使用re.DOTALL标志运行它,如下所示:

print re.split(r''\s*,\s*'', ''a, b,\nc, d, e, f, g, h, i, j, k,\nl, m, n, o, p, q, r'', re.DOTALL)

然后我得到这个结果:

[''a'', ''b'', ''c'', ''d'', ''e'', ''f'', ''g'', ''h'', ''i'', ''j'', ''k'', ''l'', ''m'', ''n'', ''o'', ''p'', ''q, r'']

请注意,“ q,r”被视为一次匹配,而不是两次。

为什么会这样呢?我不明白为什么如果我不在图案中使用点,re.DOTALL标志会有所作为。我是在做错什么还是有某种错误?

答案1

小编典典
>>> s = ''a, b,\nc, d, e, f, g, h, i, j, k,\nl, m, n, o, p, q, r''>>> re.split(r''\s*,\s*'', s)[''a'', ''b'', ''c'', ''d'', ''e'', ''f'', ''g'', ''h'', ''i'', ''j'', ''k'', ''l'', ''m'', ''n'', ''o'', ''p'', ''q'', ''r'']>>> re.split(r''\s*,\s*'', s, maxsplit=16)[''a'', ''b'', ''c'', ''d'', ''e'', ''f'', ''g'', ''h'', ''i'', ''j'', ''k'', ''l'', ''m'', ''n'', ''o'', ''p'', ''q, r'']>>> re.split(r''\s*,\s*'', s, flags=re.DOTALL)[''a'', ''b'', ''c'', ''d'', ''e'', ''f'', ''g'', ''h'', ''i'', ''j'', ''k'', ''l'', ''m'', ''n'', ''o'', ''p'', ''q'', ''r'']

问题在于您要按re.DOTALL位置传递maxsplit=0参数,而不是flags=0参数。 re.DOTALL碰巧是常数16

Python re.sub multine 文本

Python re.sub multine 文本

如何解决Python re.sub multine 文本?

我有一个包含数百个错误条目的 xml 文件,如下所示:

<dapRecord>
<dapName>
<value>UPPERCASE_VALUE</value>
</dapName>
<dapViewsRelation>
<value>and</value>
</dapViewsRelation>
</dapRecord>

需要将这些条目更改为如下所示:

<dapRecord>
<dapName>
<value>UPPERCASE_VALUE</value>
</dapName>
<dapViewsRelation>
<value>and</value>
</dapViewsRelation>
<dapBasicView>
<dapSelection>
<dapPolicy>
<value>match-all</value>
</dapPolicy>
<attr>
<name>aaa.cisco.username</name>
<value>lowercase-value</value>
<operation>EQ</operation>
<type>caseless</type>
</attr>
</dapSelection>
</dapBasicView>
</dapRecord>

我正在尝试对此运行 re.sub 以用好的条目替换错误的条目:

import re
path = "myfilehere"
with open (path,''r'') as f: 
    xml_data = f.read()
f.closed

values = ["value-1","value-2"]
for value in values:
    bad_entry = """<value>{}</value>
</dapName>
<dapViewsRelation>
<value>and</value>
</dapViewsRelation>
</dapRecord>""".format(value.upper())

    good_entry = """<value>{}</value>
</dapName>
<dapViewsRelation>
<value>and</value>
</dapViewsRelation>
<dapBasicView>
<dapSelection>
<dapPolicy>
<value>match-all</value>
</dapPolicy>
<attr>
<name>aaa.cisco.username</name>
<value>{}</value>
<operation>EQ</operation>
<type>caseless</type>
</attr>
</dapSelection>
</dapBasicView>
</dapRecord>""".format(value.upper(),value.lower())
    
    match = re.search(bad_entry,xml_data) #this works
    data = re.sub(match.group(0),good_entry,xml_data) #this does not work
    with open (path,''w'') as f:
        f.write(data)
    f.closed

re.search 找到了我的 bad_entry,但我无法让它实际将 bad_entry 替换为 good_entry 中的 re.sub。我尝试了几种不同的格式,例如在执行 re.sub 时将 bad_entry 设置为此:

match = "<value>{}</value>\n</dapName>\n<dapViewsRelation>\n<value>and</value>\n</dapViewsRelation>\n</dapRecord>".format(value.upper())

我不知道如何让 re.sub 正确替换它。

解决方法

您不需要使用 re.sub()。你没有正则表达式模式,你正在做精确匹配和替换。所以你可以使用 str.replace()

您还需要在重写文件之前进行所有替换。否则,您将获得上次替换的结果。

path = "myfilehere"
with open (path,''r'') as f: 
    xml_data = f.read()

values = ["value-1","value-2"]
for value in values:
    bad_entry = """<value>{}</value>
</dapName>
<dapViewsRelation>
<value>and</value>
</dapViewsRelation>
</dapRecord>""".format(value.upper())

    good_entry = """<value>{}</value>
</dapName>
<dapViewsRelation>
<value>and</value>
</dapViewsRelation>
<dapBasicView>
<dapSelection>
<dapPolicy>
<value>match-all</value>
</dapPolicy>
<attr>
<name>aaa.cisco.username</name>
<value>{}</value>
<operation>EQ</operation>
<type>caseless</type>
</attr>
</dapSelection>
</dapBasicView>
</dapRecord>""".format(value.upper(),value.lower())
    
    xml_data = xml_data.replace(bad_entry,good_entry)

with open(path,''w'') as f:
    f.write(xml_data)
,

对于那些来这里寻找 multiline 使用 re 的人,您可以使用 flags=re.DOTALL 来读取和替换整个输入,而不仅仅是以 \n 结尾的行

python 正则表达式 re.sub & re.subn

python 正则表达式 re.sub & re.subn

python正则表达式模块简介

Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。Python 1.5之前版本则是通过 regex 模块提供 Emacs 风格的模式。Emacs 风格模式可读性稍差些,而且功能也不强,因此编写新代码时尽量不要再使用 regex 模块,当然偶尔你还是可能在老代码里发现其踪影。

就其本质而言,正则表达式(或 RE)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现。使用这个小型语言,你可以为想要匹配的相应字符串集指定规则;该字符串集可能包含英文语句、e-mail地址、TeX命令或任何你想搞定的东西。然后你可以问诸如“这个字符串匹配该模式吗?”或“在这个字符串中是否有部分匹配该模式呢?”。你也可以使用 RE 以各种方式来修改或分割字符串。

正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。在高级用法中,也许还要仔细留意引擎是如何执行给定 RE ,如何以特定方式编写 RE 以令生产的字节码运行速度更快。本文并不涉及优化,因为那要求你已充分掌握了匹配引擎的内部机制。

正则表达式语言相对小型和受限(功能有限),因此并非所有字符串处理都能用正则表达式完成。当然也有些任务可以用正则表达式完成,不过最终表达式会变得异常复杂。碰到这些情形时,编写 Python 代码进行处理可能反而更好;尽管 Python 代码比一个精巧的正则表达式要慢些,但它更易理解。

正则表达式一个比较常见的用途是找到所有模式匹配的字符串并用不同的字符串来替换它们。sub方法提供一个替换值,可以是字符串或函数,和一个要被处理的字符串。

Grammar:

re.sub(pattern,repl,string[,count])

使用repl替换string中每一个匹配的子串后返回替换后的字符串。

当repl是一个字符串时,可以使用\id或\g、\g引用分组,但不能使用编号0。

当repl是一个方法时,这个方法应当只接受一个参数(Match对象),并返回一个字符串用于替换(返回的字符串中不能再引用分组)。

count用于指定最多替换次数,不指定时全部替换。

re.subn(pattern,count])

返回 (sub(repl,count]),替换次数)。

Case:

#coding=utf-8
import re
str = "https://i.cnb1logs.co2m/Edi3tPosts.asp4x?opt=999"
pattern=re.compile(r'(\.)')
print '\.     :',re.sub(pattern,'-',str)
pattern=re.compile(r'\/([^*]+)\/')
print '\/([^*]+)\/ :',r'<em>\1<em>',str)
pattern = re.compile(r'(\w+)(\w+)(\d+)')
#先切片测试
print re.split(pattern,str)
print re.sub(pattern,r'\3 \1',str)
#subn统计sub替换次数
print re.subn(pattern,str)

Output

\.     : https://i-cnb1logs-co2m/Edi3tPosts-asp4x?opt=999
\/([^*]+)\/ : https:<em>/i.cnb1logs.co2m<em>Edi3tPosts.asp4x?opt=999
['https://i.','cn','b','1','logs.','c','o','2','m/','Ed','i','3','tPosts.','as','p','4','x?opt=','9','']
https://i.1 cnlogs.2 cm/3 EdtPosts.4 asx?opt=9 9
('https://i.1 cnlogs.2 cm/3 EdtPosts.4 asx?opt=9 9',5)
***Repl Closed***

总结

关于Python正则表达式中的错误?带有re.MULTILINE的re.sub的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于JAVA正则表达式中MULTILINE怎么用、Python 2.7.1的re模块中带有re.split函数和re.DOTALL标志的错误、Python re.sub multine 文本、python 正则表达式 re.sub & re.subn等相关内容,可以在本站寻找。

本文标签: