Python:如何向re.sub()的替换参数添加计数器
我想将ID添加到html标记中。例如,我想更改:Python:如何向re.sub()的替换参数添加计数器,python,html,regex,html-parsing,auto-increment,Python,Html,Regex,Html Parsing,Auto Increment,我想将ID添加到html标记中。例如,我想更改: <p>First paragraph</p> <p>Second paragraph</p> <p>Third paragraph</p> 第一段 第二段 第三段 到 第一段 第二段 第三段 IIRC,可以使用lambda函数来实现此功能,但我记不清确切的语法。我会使用HTML解析器,如 其思想是迭代所有用于索引的段落,从1开始: from bs4 import Bea
<p>First paragraph</p>
<p>Second paragraph</p>
<p>Third paragraph</p>
第一段
第二段
第三段
到
第一段
第二段
第三段
IIRC,可以使用lambda函数来实现此功能,但我记不清确切的语法。我会使用HTML解析器,如 其思想是迭代所有用于索引的段落,从
1
开始:
from bs4 import BeautifulSoup
data = """
<p>First paragraph</p>
<p>Second paragraph</p>
<p>Third paragraph</p>
"""
soup = BeautifulSoup(data, 'html.parser')
for index, p in enumerate(soup.find_all('p'), start=1):
p['id'] = index
print soup
从bs4导入美化组
data=”“”
第一段
第二段
第三段
"""
soup=BeautifulSoup(数据'html.parser')
对于索引,枚举中的p(soup.find_all('p'),start=1):
p['id']=索引
印花汤
印刷品:
<p id="1">First paragraph</p>
<p id="2">Second paragraph</p>
<p id="3">Third paragraph</p>
第一段
第二段
第三段
我会使用HTML解析器,比如
其思想是迭代所有用于索引的段落,从1
开始:
from bs4 import BeautifulSoup
data = """
<p>First paragraph</p>
<p>Second paragraph</p>
<p>Third paragraph</p>
"""
soup = BeautifulSoup(data, 'html.parser')
for index, p in enumerate(soup.find_all('p'), start=1):
p['id'] = index
print soup
从bs4导入美化组
data=”“”
第一段
第二段
第三段
"""
soup=BeautifulSoup(数据'html.parser')
对于索引,枚举中的p(soup.find_all('p'),start=1):
p['id']=索引
印花汤
印刷品:
<p id="1">First paragraph</p>
<p id="2">Second paragraph</p>
<p id="3">Third paragraph</p>
第一段
第二段
第三段
使用re.sub()
x=['第一段,'第二段,'第三段']
对于枚举中的i,p(x,start=1):
... re.sub(r'^',''%i,p)
...
“
第一段”
“
第二段”
“
第三段”
使用re.sub()
x=['第一段,'第二段,'第三段']
对于枚举中的i,p(x,start=1):
... re.sub(r'^',''%i,p)
...
“
第一段”
“
第二段”
“
第三段”
如果您想使用regex,快速而肮脏的解决方案是使用全局变量,如下所示:
i = 0
def replace(match):
global i
i += 1
return '<p id="{0}">'.format(i)
re.sub(pattern, replace, your_string)
如果您想使用正则表达式,那么快速而肮脏的解决方案是使用一个全局变量,如下所示:
i = 0
def replace(match):
global i
i += 1
return '<p id="{0}">'.format(i)
re.sub(pattern, replace, your_string)
不是很通用,但应该可以
def sub_p(string):
def inc(m, i=[0]):
i[0] += 1
return '<p id="%i">' % i[0]
return re.sub(r"<p>", inc, string)
def sub_p(字符串):
def公司(m,i=[0]):
i[0]+=1
返回''%i[0]
返回re.sub(r“”,inc,string)
不是很通用,但应该可以
def sub_p(string):
def inc(m, i=[0]):
i[0] += 1
return '<p id="%i">' % i[0]
return re.sub(r"<p>", inc, string)
def sub_p(字符串):
def公司(m,i=[0]):
i[0]+=1
返回''%i[0]
返回re.sub(r“”,inc,string)
我想补充@Michael0x2a的答案
他的代码中有一个主要的bug,特别是:如果没有任何东西被替换,计数器仍然会返回1。还有一些小问题
为了解决主要缺陷,可以使用快速哈希算法。我会用Adler32
import re
import zlib
class Replace(object):
def __init__(self):
self.counter = 0
def __call__(self, match):
self.counter += 1
return '<p id="{0}">'.format(self.counter)
replace = Replace()
old = zlib.adler32(your_string)
replaced = re.sub(pattern, replace, your_string)
new = zlib.adler32(replaced)
if(old == new):
replace.counter = 0
重新导入
进口zlib
类替换(对象):
定义初始化(自):
self.counter=0
定义呼叫(自我,匹配):
self.counter+=1
返回''.format(self.counter)
replace=replace()
old=zlib.adler32(您的_字符串)
replaced=re.sub(模式、替换、您的字符串)
新=zlib.adler32(已替换)
如果(旧=新):
replace.counter=0
我想补充@Michael0x2a的答案
他的代码中有一个主要的bug,特别是:如果没有任何东西被替换,计数器仍然会返回1。还有一些小问题
为了解决主要缺陷,可以使用快速哈希算法。我会用Adler32
import re
import zlib
class Replace(object):
def __init__(self):
self.counter = 0
def __call__(self, match):
self.counter += 1
return '<p id="{0}">'.format(self.counter)
replace = Replace()
old = zlib.adler32(your_string)
replaced = re.sub(pattern, replace, your_string)
new = zlib.adler32(replaced)
if(old == new):
replace.counter = 0
重新导入
进口zlib
类替换(对象):
定义初始化(自):
self.counter=0
定义呼叫(自我,匹配):
self.counter+=1
返回''.format(self.counter)
replace=replace()
old=zlib.adler32(您的_字符串)
replaced=re.sub(模式、替换、您的字符串)
新=zlib.adler32(已替换)
如果(旧=新):
replace.counter=0
但由于它涉及html标记,我更喜欢使用beautifulsoup,如@alecxe answer中所述。段落首先是如何进入列表的?@tdelaney答案演示了如何使用regex替换输入标记的id
。Op从来没有提到过要更改文档中的每一个p
,或者其他一些内容,以便于您快速回复和有趣的解决方案。但是,由于它涉及html标记,我更喜欢使用beautifulsoup,如@alecxe answer中所述。段落是如何首先进入列表的?@tdelaney答案演示了如何替换id
用于使用regex的输入标记。Op从未提及过任何关于更改文档中的每个p
,感谢您的快速回复和有趣的解决方案。感谢您的快速回复和出色的解决方案!感谢您的快速回复和出色的解决方案!感谢您的快速回复和您感兴趣的解决方案。如果没有匹配项,此解决方案将无法正常工作-我将尽快为您的快速回复和您感兴趣的解决方案发布修复。如果没有匹配项,此解决方案将无法正常工作-我将尽快为您的快速回复和您感兴趣的解决方案发布修复解决方案。感谢您的快速回复和有趣的解决方案。这是否回答了您的问题?这回答了你的问题吗?