Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:如何向re.sub()的替换参数添加计数器_Python_Html_Regex_Html Parsing_Auto Increment - Fatal编程技术网

Python:如何向re.sub()的替换参数添加计数器

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

我想将ID添加到html标记中。例如,我想更改:

<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
,感谢您的快速回复和有趣的解决方案。感谢您的快速回复和出色的解决方案!感谢您的快速回复和出色的解决方案!感谢您的快速回复和您感兴趣的解决方案。如果没有匹配项,此解决方案将无法正常工作-我将尽快为您的快速回复和您感兴趣的解决方案发布修复。如果没有匹配项,此解决方案将无法正常工作-我将尽快为您的快速回复和您感兴趣的解决方案发布修复解决方案。感谢您的快速回复和有趣的解决方案。这是否回答了您的问题?这回答了你的问题吗?