Python字符串替换标记

2024-10-01 00:25:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在解析HTML/xml文本,并使用BeautifulSoup从中删除一组标记,如fs、img。你知道吗

我正在分析的文档有<tag ... >而不是<tag ..../>

所以我想用RegEx把所有的<tag ... >转换成<tag ..../>。所以基本上我使用下面的regex "<tag".*> to <tag/>。但在大文件上要花很多时间。有没有更好的正则表达式或者更好的方法来解决这个问题?你知道吗

或者使用bs可以删除<tag>之类的标记(不关闭标记)

编辑

提出这个问题的原因

我想为一个深度学习项目解析很多文档。所以我在刮网。我不需要标记集中的<;sometag/>;标记出现在文档中,因此我使用bs来删除它们。有些文档具有标记,因此bs无法在不关闭标记的情况下创建解析树。所以我用regex来添加一个终止符。但这是没有效率的

我的代码

# My tag is fs here
content = re.sub(r"<fs.*>", "<fs/>", content)

sp = BeautifulSoup(content, "html.parser")

[s.extract() for s in sp("fs")]

样本输入:

<Sentence id='2001'>
1   ((  CCP <fs name='CCP' drel='sent-adv:VGNF'>
1.1 ಹೀಗೆ    CC__CCS <fs af='ಹೀಗೆ,avy,,,,d,0,0' name='ಹೀಗೆ'>
    ))
2   ((  NP  <fs name='NP' drel='r6:NP2'>
2.1 ಪತ್ರದ   N__NN   <fs af='ಪತ್ರ,n,,sg,3,o,ಅದ್+ಅ,ax+a' name='ಪತ್ರದ'>
    ))
3   ((  NP  <fs name='NP2' drel='k1:VGF'>
3.1 ಯಾವ DM__DMQ <fs af='ಯಾವ,pn,,,,d,0,0' name='ಯಾವ'>
3.2 ಯಾವ DM__DMQ <fs af='ಯಾವ,pn,,,,d,0,0' name='ಯಾವ2'>
3.3 ಅಂಶ N__NN   <fs af='ಅಂಶ,n,,sg,3,d,0,0' name='ಅಂಶ'>
    ))
4   ((  NP  <fs name='NP3' drel='k7p:VGF'>
4.1 ಎಲ್ಲೆಲ್ಲಿ   PR__PRQ <fs af='ಎಲ್ಲಿ,pn,,,,o,ಎಲ್ಲಿ,eVlli' name='ಎಲ್ಲೆಲ್ಲಿ'>
    ))
5   ((  VGF <fs af=',,,,,,,' name='VGF' drel='ccof:CCP2' stype='imperative' voicetype='active'>
5.1 ಇರಬೇಕು  V__VM__VF   <fs af='ಇರು,v,,,,,ಅ+ಬೇಕು,a+beku' name='ಇರಬೇಕು'>
    ))
6   ((  CCP <fs name='CCP2' drel='k2:VGNF'>
6.1 ಎಂಬುದನ್ನು   CC__CCS <fs af='ಎಂಬುದು,avy,,,,,ಅ+ಅನ್ನು,a+annu' name='ಎಂಬುದನ್ನು'>
    ))
7   ((  VGNF    <fs name='VGNF' drel='rh:VGF2'>
7.1 ಗೊತ್ತುಪಡಿಸುವುದರಿಂದ  V__VM__VNF  <fs af='ಗೊತ್ತುಪಡಿಸು,v,,,,,ಉವ್+ಉ+ಉದ್+ಅ+ಅರ್+ಇ+ಇಂದ,uv+u+ux+a+ar+i+iMxa' name='ಗೊತ್ತುಪಡಿಸುವುದರಿಂದ'>
    ))
8   ((  NP  <fs name='NP4' drel='r6:NP5'>
8.1 ಇದರ PR__PRP <fs af='ಇದು,pn,n,sg,3,o,ಅ+ಅರ್+ಅ,a+ar+a' name='ಇದರ'>
    ))
9   ((  NP  <fs name='NP5' drel='k1:VGF2'>
9.1 ಲೇಖಕ    N__NN   <fs af='ಲೇಖಕ,n,m,sg,3,d,0,0' name='ಲೇಖಕ'>
    ))
10  ((  NP  <fs name='NP6' drel='k1s:VGF2'>
10.1    ಅತಿಯಾದ  JJ  <fs af='ಅತಿ,adj,,sg,3,o,ಇಯ್+ಆ+ಆಗು+ದ್+ಅ,iy+A+Agu+x+a' name='ಅತಿಯಾದ'>
10.2    ಸಂಪ್ರದಾಯ    N__NN   <fs af='ಸಂಪ್ರದಾಯ,n,,sg,3,d,0,0' name='ಸಂಪ್ರದಾಯ'>
10.3    ಶರಣ N__NN   <fs af='ಶರಣ,n,,sg,3,d,0,0' name='ಶರಣ'>
    ))
11  ((  VGF <fs af=',,,,,,,' name='VGF2' drel='ccof:CCP3' stype='imperative' voicetype='active'>
11.1    ಆಗಬೇಕು  V__VM__VF   <fs af='ಆಗು,v,,,,,ಅ+ಬೇಕು,a+beku' name='ಆಗಬೇಕು'>
    ))
12  ((  CCP <fs name='CCP3' drel='vmod:NULL__VGF'>
12.1    ಎಂದು    CC__CCS <fs af='ಎಂದು,avy,,,,d,0,0' name='ಎಂದು'>
    ))
13  ((  NEGP    <fs af=',,,,,,,' name='NEGP' drel='pof:NULL__VGF'>
13.1    ಅಲ್ಲ    RP__NEG <fs af='ಅಲ್ಲ,avy,,,,d,0,0' name='ಅಲ್ಲ'>
    ))
14  ((  NULL__VGF   <fs af=',,,,,,,' name='NULL__VGF' stype='declarative' voicetype='active'>
14.1    NULL    V__VM__VF   <fs af=',,,,,,,' troot='' mtype='non-gap' name='NULL'>
    ))
15  ((  BLK <fs name='BLK' drel='rsym-eos:NULL__VGF'>
15.1    .   RD__PUNC    <fs af='.,punc,,,,,,' name='.'>
    ))
</Sentence>

<Sentence id='2002'>
1   ((  NP  <fs name='NP' drel='k2:VGNF'>
1.1 ಸ್ಥೂಲವಾದ    JJ  <fs af='ಸ್ಥೂಲ,adj,,sg,3,o,ಅವ್+ಆ+ಆಗು+ದ್+ಅ,av+A+Agu+x+a' name='ಸ್ಥೂಲವಾದ'>
1.2 ಈ   DM__DMD <fs af='ಈ,pn,,,,d,0,0' name='ಈ'>
1.3 ಕಟ್ಟುಗಳನ್ನು N__NN   <fs af='ಕಟ್ಟು,n,,pl,3,o,ಗಳು+ಅ+ಅನ್ನು,galYu+a+annu' name='ಕಟ್ಟುಗಳನ್ನು'>
    ))
2   ((  VGNF    <fs name='VGNF' drel='nmod:VGF'>
2.1 ಅನುಸರಿಸಿಯೂ  V__VM__VNF  <fs af='ಅನುಸಾರ,v,,,,,ಇ+ಇಸ್+ಉ,i+is+u' droot1='ಅನುಸರಿಸು' dcat1='v' dcase1='o' dcm1='ಇ' dsuff1='i' droot2='ಅನುಸರಿಸಿ' dcat2='v' dcase2='o' dcm2='ಇಯ್+ಊ' dsuff2='iy+U' droot3='ಅನುಸರಿಸಿಯೂ' dcat3='v' dcase3='d' dcm3='0' dsuff3='0' name='ಅನುಸರಿಸಿಯೂ'>
    ))
3   ((  NP  <fs name='NP2' drel='k1:VGF'>
3.1 ಆತ  PR__PRP <fs af='ಆತ,pn,m,sg,3,d,0,0' name='ಆತ'>
    ))
4   ((  NP  <fs name='NP3' drel='r6:NP4'>
4.1 ತನ್ನ    PR__PRF <fs af='ತಾನು,pn,any,sg,2,o,ನ್ನ್+ಅ,nn+a' name='ತನ್ನ'>
    ))
5   ((  NP  <fs name='NP4' drel='k2:VGF'>
5.1 ವೈಶಿಷ್ಟ್ಯವನ್ನು  N__NN   <fs af='ವೈಶಿಷ್ಟ್ಯ,n,,sg,3,o,ಅವ್+ಅ+ಅನ್ನು,av+a+annu' name='ವೈಶಿಷ್ಟ್ಯವನ್ನು'>
    ))
6   ((  NP  <fs name='NP5' drel='k7:VGF'>
6.1 ಅದರಲ್ಲಿ PR__PRP <fs af='ಅದು,pn,n,sg,3,o,ಅ+ಅರ್+ಅ+ಅಲ್ಲಿ,a+ar+a+alli' name='ಅದರಲ್ಲಿ'>
    ))
7   ((  VGF <fs af=',,,,,,,' name='VGF' stype='declarative' voicetype='active'>
7.1 ತೋರ್ಪಡಿಸಬಹುದು   V__VM__VF   <fs af='ತೋರ್ಪಡೆ,v,,,,,ಇ+ಇಸ್+ಉ,i+is+u' droot1='ತೋರ್ಪಡಿಸು' dcat1='v' dcase1='o' dcm1='ಅ+ಬಹುದು' dsuff1='a+bahuxu' droot2='ತೋರ್ಪಡಿಸಬಹುದು' dcat2='v' dcase2='d' dcm2='0' dsuff2='0' name='ತೋರ್ಪಡಿಸಬಹುದು'>
    ))
8   ((  BLK <fs name='BLK' drel='rsym_eos:VGF'>
8.1 .   RD__PUNC    <fs af='.,punc,,,,,,' name='.'>
    ))
</Sentence>

<Sentence id='2003'>
1   ((  NP  <fs name='NP' drel='r6v:VGNF'>
1.1 ಪದ್ಯಕ್ಕೆ    N__NN   <fs af='ಪದ್ಯ,n,,sg,3,o,ಕ್ಕೆ,kkeV' name='ಪದ್ಯಕ್ಕೆ'>
    ))
2   ((  NP  <fs name='NP2' drel='r6:NP3'>
2.1 ಛಂದಸ್ಸಿನ    N__NN   <fs af='ಛಂದಸ್ಸು,n,,sg,3,o,ಇ+ಇನ್+ಅ,i+in+a' name='ಛಂದಸ್ಸಿನ'>
    ))
3   ((  NP  <fs name='NP3' drel='k1:VGNF'>
3.1 ಕಟ್ಟು   N__NN   <fs af='ಕಟ್ಟು,n,,sg,3,d,0,0' name='ಕಟ್ಟು'>
    ))
4   ((  VGNF    <fs name='VGNF' drel='vmod:VGNF5'>
4.1 ಇದ್ದರೂ  V__VM__VNF  <fs af='ಇರು,v,,,,,ದ್ದ್+ಅ+ಅರ್+ಊ,xx+a+ar+U' name='ಇದ್ದರೂ'>
    ))
5   ((  JJP <fs af=',,,,,,,' name='JJP' drel='nmod:NP4'>
5.1 ಅದರಲ್ಲೂ JJ  <fs af='ಅದು,adj,,sg,3,o,ಅ+ಅರ್+ಅ+ಅಲ್ಲಿ+ಊ,a+ar+a+alli+U' name='ಅದರಲ್ಲೂ'>
    ))
6   ((  NP  <fs name='NP4' drel='k2:VGNF2'>
6.1 ಕಾವ್ಯ   N__NN   <fs af='ಕಾವ್ಯ,n,,sg,3,d,0,0' name='ಕಾವ್ಯ'>
6.2 ಗುಣವನ್ನು    N__NN   <fs af='ಗುಣ,n,,sg,3,o,ಅವ್+ಅ+ಅನ್ನು,av+a+annu' name='ಗುಣವನ್ನು'>
    ))
7   ((  NP  <fs name='NP5' drel='k1:VGNF2'>
7.1 ಒಬ್ಬ    N__NN   <fs af='ಒಬ್ಬ,n,m,sg,3,d,0,0' name='ಒಬ್ಬ'>
7.2 ಉತ್ತಮ   JJ  <fs af='ಉತ್ತಮ,adj,,,,d,0,0' name='ಉತ್ತಮ'>
7.3 ಕವಿ N__NN   <fs af='ಕವಿ,n,,sg,3,d,0,0' name='ಕವಿ'>
    ))
8   ((  RBP <fs af=',,,,,,,' name='RBP' drel='adv:VGNF2'>
8.1 ಹೇಗೆ    RB  <fs af='ಹೇಗೆ,adv,,,,,,' name='ಹೇಗೆ'>
    ))
9   ((  VGNF    <fs af=',,,,,,,' name='VGNF2' drel='nmod__relc:RBP2'>
9.1 ಪ್ರಕಟಿಸಬಲ್ಲನೋ   V__VM__VNF  <fs af='ಪ್ರಕಟ,v,,,,,ಇ+ಇಸ್+ಉ,i+is+u' droot1='ಪ್ರಕಟಿಸು' dcat1='v' dcase1='o' dcm1='ಅ+ಬಲ್ಲ+ಅನ್+ಓ' dsuff1='a+balla+an+o' droot2='ಪ್ರಕಟಿಸಬಲ್ಲನೋ' dcat2='v' dg2='m' dn2='sg' dp2='3' dcase2='d' dcm2='0' dsuff2='0' name='ಪ್ರಕಟಿಸಬಲ್ಲನೋ'>
    ))
10  ((  RBP <fs af=',,,,,,,' name='RBP2' drel='pof:VGNF5'>
10.1    ಹಾಗೆ    RB  <fs af='ಹಾಗೆ,adv,,,,,,' name='ಹಾಗೆ'>
    ))
11  ((  NP  <fs name='NP6' drel='k4:VGNF3'>
11.1    ಪತ್ರಕ್ಕೆ    N__NN   <fs af='ಪತ್ರ,n,,sg,3,o,ಕ್ಕೆ,kkeV' name='ಪತ್ರಕ್ಕೆ'>
    ))
12  ((  NP  <fs name='NP7' drel='k1:VGNF3'>
12.1    ಒಂದು    QT__QTC <fs af='ಒಂದು,num,,sg,3,d,0,0' name='ಒಂದು'>
12.2    ಗೊತ್ತಾದ JJ  <fs af='ಗೊತ್ತು,adj,,,,o,ಆ+ಆಗು+ದ್+ಅ,A+Agu+x+a' name='ಗೊತ್ತಾದ'>
12.3    ಮಾದರಿ   N__NN   <fs af='ಮಾದರಿ,n,,sg,3,d,0,0' name='ಮಾದರಿ'>
    ))
13  ((  VGNF    <fs name='VGNF3' drel='vmod:VGNF4'>
13.1    ಇದ್ದರೂ  V__VM__VNF  <fs af='ಇರು,v,,,,,ದ್ದ್+ಅ+ಅರ್+ಊ,xx+a+ar+U' name='ಇದ್ದರೂ2'>
    ))
14  ((  JJP <fs af=',,,,,,,' name='JJP2' drel='nmod:NP8'>
14.1    ಅದರಲ್ಲೂ JJ  <fs af='ಅದು,adj,,sg,3,o,ಅ+ಅರ್+ಅ+ಅಲ್ಲಿ+ಊ,a+ar+a+alli+U' name='ಅದರಲ್ಲೂ2'>
    ))
15  ((  NP  <fs name='NP8' drel='k1:VGNF4'>
15.1    ಲೇಖಕ    N__NN   <fs af='ಲೇಖಕ,n,m,sg,3,d,0,0' name='ಲೇಖಕ'>
    ))
16  ((  NP  <fs name='NP9' drel='r6:NP10'>
16.1    ತನ್ನ    PR__PRF <fs af='ತಾನು,pn,any,sg,2,o,ನ್ನ್+ಅ,nn+a' name='ತನ್ನ'>
    ))
17  ((  NP  <fs name='NP10' drel='k2:VGNF4'>
17.1    ವೈಯಕ್ತಿಕ    JJ  <fs af='ವೈಯಕ್ತಿಕ,adj,,sg,3,d,0,0' name='ವೈಯಕ್ತಿಕ'>
17.2    ಪ್ರಭಾವವನ್ನು N__NN   <fs af='ಪ್ರಭಾವ,n,,sg,3,o,ಅವ್+ಅ+ಅನ್ನು,av+a+annu' name='ಪ್ರಭಾವವನ್ನು'>
    ))
18  ((  VGNF    <fs name='VGNF4' drel='vmod:VGNF5'>
18.1    ಬೀರಿ    V__VM__VNF  <fs af='ಬೀರು,v,,,,,ಇ,i' name='ಬೀರಿ'>
    ))
19  ((  NP  <fs name='NP11' drel='k1:VGNF5'>
19.1    ಅದು PR__PRP <fs af='ಅದು,pn,n,sg,3,d,0,0' name='ಅದು'>
    ))
20  ((  NP  <fs name='NP12' drel='k1s:VGNF5'>
20.1    ಪರಿಣಾಮಕಾರಿ  N__NN   <fs af='ಪರಿಣಾಮಕಾರಿ,n,,sg,3,d,0,0' name='ಪರಿಣಾಮಕಾರಿ'>
    ))
21  ((  VGNF    <fs name='VGNF5' drel='vmod:VGF'>
21.1    ಆಗುವಂತೆ V__VM__VNF  <fs af='ಆಗು,v,,,,,ಉವ್+ಅ+ಅಂತೆ,uv+a+aMweV' name='ಆಗುವಂತೆ'>
    ))
22  ((  VGF <fs af=',,,,,,,' name='VGF' stype='declarative' voicetype='active'>
22.1    ಮಾಡಬಹುದು    V__VM__VF   <fs af='ಮಾಡು,v,,,,,ಅ+ಬಹುದು,a+bahuxu' name='ಮಾಡಬಹುದು'>
    ))
23  ((  BLK <fs name='BLK' drel='rsym_eos:VGF'>
23.1    .   RD__PUNC    <fs af='.,punc,,,,,,' name='.'>
    ))
</Sentence>

Tags: name标记tagnpvmk1nnpr
2条回答

所以这需要分步骤解决,因为不清楚你到底想要什么。

我完全陷入了被BS4挫败的人群中,我更喜欢在情境中使用regex,尽管我认识到有些人不同意这种说法。

如果您只是尝试将结束标记添加到开始标记,并且文档的格式相对一致,根据您的示例,请尝试此操作

>>> import re


>>> string = '''1   ((  CCP <fs name='CCP' drel='sent-adv:VGNF'>
1.1 ಹೀಗೆ    CC__CCS <fs af='ಹೀಗೆ,avy,,,,d,0,0' name='ಹೀಗೆ'>
    ))
2   ((  NP  <fs name='NP' drel='r6:NP2'>
2.1 ಪತ್ರದ   N__NN   <fs af='ಪತ್ರ,n,,sg,3,o,ಅದ್+ಅ,ax+a' name='ಪತ್ರದ'>
    ))
3   ((  NP  <fs name='NP2' drel='k1:VGF'>
3.1 ಯಾವ DM__DMQ <fs af='ಯಾವ,pn,,,,d,0,0' name='ಯಾವ'>
3.2 ಯಾವ DM__DMQ <fs af='ಯಾವ,pn,,,,d,0,0' name='ಯಾವ2'>
3.3 ಅಂಶ N__NN   <fs af='ಅಂಶ,n,,sg,3,d,0,0' name='ಅಂಶ'>'''


>>> print(re.sub(r'(<fs[\S\s]+?\'>)', r'\1</fs>', string))


#Ouput
1   ((  CCP <fs name='CCP' drel='sent-adv:VGNF'></fs>
1.1 ಹೀಗೆ    CC__CCS <fs af='ಹೀಗೆ,avy,,,,d,0,0' name='ಹೀಗೆ'></fs>
    ))
2   ((  NP  <fs name='NP' drel='r6:NP2'></fs>
2.1 ಪತ್ರದ   N__NN   <fs af='ಪತ್ರ,n,,sg,3,o,ಅದ್+ಅ,ax+a' name='ಪತ್ರದ'></fs>
    ))
3   ((  NP  <fs name='NP2' drel='k1:VGF'></fs>
3.1 ಯಾವ DM__DMQ <fs af='ಯಾವ,pn,,,,d,0,0' name='ಯಾವ'></fs>
3.2 ಯಾವ DM__DMQ <fs af='ಯಾವ,pn,,,,d,0,0' name='ಯಾವ2'></fs>
3.3 ಅಂಶ N__NN   <fs af='ಅಂಶ,n,,sg,3,d,0,0' name='ಅಂಶ'></fs>

如果要删除它们

>>> print(re.sub(r'(<fs[\S\s]+?\'>)', r'</fs>', string))


#OUTPUT
1   ((  CCP </fs>
1.1 ಹೀಗೆ    CC__CCS </fs>
    ))
2   ((  NP  </fs>
2.1 ಪತ್ರದ   N__NN   </fs>
    ))
3   ((  NP  </fs>
3.1 ಯಾವ DM__DMQ </fs>
3.2 ಯಾವ DM__DMQ </fs>
3.3 ಅಂಶ N__NN   </fs>

如果您只想将开始标记“转换”为结束标记

>>> print(re.sub(r'(<)(fs)(?=[\S\s]+?\'>)', r'\1/\2', string))


#OUTPUT
1   ((  CCP </fs name='CCP' drel='sent-adv:VGNF'>
1.1 ಹೀಗೆ    CC__CCS </fs af='ಹೀಗೆ,avy,,,,d,0,0' name='ಹೀಗೆ'>
    ))
2   ((  NP  </fs name='NP' drel='r6:NP2'>
2.1 ಪತ್ರದ   N__NN   </fs af='ಪತ್ರ,n,,sg,3,o,ಅದ್+ಅ,ax+a' name='ಪತ್ರದ'>
    ))
3   ((  NP  </fs name='NP2' drel='k1:VGF'>
3.1 ಯಾವ DM__DMQ </fs af='ಯಾವ,pn,,,,d,0,0' name='ಯಾವ'>
3.2 ಯಾವ DM__DMQ </fs af='ಯಾವ,pn,,,,d,0,0' name='ಯಾವ2'>
3.3 ಅಂಶ N__NN   </fs af='ಅಂಶ,n,,sg,3,d,0,0' name='ಅಂಶ'>

或者更接近您的样本

>>> print(re.sub(r'(<fs[\S\s]+?)(\'>)', r'\1/\2', string))


#OUTPUT
1   ((  CCP <fs name='CCP' drel='sent-adv:VGNF/'>
1.1 ಹೀಗೆ    CC__CCS <fs af='ಹೀಗೆ,avy,,,,d,0,0' name='ಹೀಗೆ/'>
    ))
2   ((  NP  <fs name='NP' drel='r6:NP2/'>
2.1 ಪತ್ರದ   N__NN   <fs af='ಪತ್ರ,n,,sg,3,o,ಅದ್+ಅ,ax+a' name='ಪತ್ರದ/'>
    ))
3   ((  NP  <fs name='NP2' drel='k1:VGF/'>
3.1 ಯಾವ DM__DMQ <fs af='ಯಾವ,pn,,,,d,0,0' name='ಯಾವ/'>
3.2 ಯಾವ DM__DMQ <fs af='ಯಾವ,pn,,,,d,0,0' name='ಯಾವ2/'>
3.3 ಅಂಶ N__NN   <fs af='ಅಂಶ,n,,sg,3,d,0,0' name='ಅಂಶ/'>

您可以使用BeautifulSoup删除所有<img>标记:

import requests
import bs4

response = requests.get('https://stackoverflow.com/questions/55673916/python-string-replace-html-tags')
content = response.content

soup = bs4.BeautifulSoup(content, 'html.parser')
imgs = soup.find_all('img')

for img in imgs:
    img.extract()

# Print without <img> tags
print(str(soup))

这对我来说既适用于<img ... />又适用于<img ...>标记。你知道吗

相关问题 更多 >