如何使用python规则化宽度和高度x2

如何使用python规则化宽度和高度x2,python,regex,Python,Regex,我必须做很多工作来改变这种状况: <img src = "/" height="111" width="10" /> 到 所以我想使用python正则表达式 这是我的代码: import re s = '<img src = "werwerwe" height="111" width="10" />' def a(x): print x.group(2) print x.group(4) ss = re.sub(r'''<img.*(

我必须做很多工作来改变这种状况:

<img src = "/" height="111" width="10" />


所以我想使用python正则表达式 这是我的代码:

import re

s = '<img src = "werwerwe" height="111" width="10" />'

def a(x):
    print x.group(2)
    print x.group(4)

ss = re.sub(r'''<img.*(width\s*="?(\d+)"?)*\s*(height\s*="?(\d+)"?)*''',a, s)

print ss
重新导入
s=“”
def a(x):
打印x组(2)
打印x组(4)
ss=re.sub(r'')
def a(x):
b=x.组(0)
b=b.replace(x.group(1),str(int(x.group(1))*2))
b=b.replace(x.group(2),str(int(x.group(2))*2))
返回b
ss=re.sub(r'']*>'',a,s)
打印ss

尝试使用以下正则表达式:


尝试使用以下正则表达式:


不要使用正则表达式解析HTML。请使用BeautifulSoup

import re

s = '<img src = "/" height="111" width="10" />'


def a(x):
    b = x.group(0)
    b = b.replace(x.group(1),str(int(x.group(1))*2))
    b = b.replace(x.group(2),str(int(x.group(2))*2))
    return b

ss = re.sub(r'''<img.*?height=\"(\d+)\".*?width=\"(\d+)\"[^>]*>''',a, s)

print ss
>>从BeautifulSoup导入BeautifulSoup
>>>ht='foo无论什么:

    • ' >>>汤=美汤(ht) >>>汤 foo无论什么:

        • >>>soup.findAll('img')) [, ] >>>对于汤中的img.findAll('img'): …ht=int(img['height']) …wi=int(img['width']) …img['height']=str(ht*2) …img['width']=str(wi*2) ... ... >>>打印汤。美化 福 无论什么:

          >>>
不要使用正则表达式解析HTML。请使用BeautifulSoup

import re

s = '<img src = "/" height="111" width="10" />'


def a(x):
    b = x.group(0)
    b = b.replace(x.group(1),str(int(x.group(1))*2))
    b = b.replace(x.group(2),str(int(x.group(2))*2))
    return b

ss = re.sub(r'''<img.*?height=\"(\d+)\".*?width=\"(\d+)\"[^>]*>''',a, s)

print ss
>>从BeautifulSoup导入BeautifulSoup
>>>ht='foo无论什么:

    • ' >>>汤=美汤(ht) >>>汤 foo无论什么:

        • >>>soup.findAll('img')) [, ] >>>对于汤中的img.findAll('img'): …ht=int(img['height']) …wi=int(img['width']) …img['height']=str(ht*2) …img['width']=str(wi*2) ... ... >>>打印汤。美化 福 无论什么:

          >>>
。使用以下内容正确解析它

import lxml.html
html=“”
etree=lxml.html.fromstring(html)
images=etree.xpath(“//img”)
对于图像中的图像:
h=int(image.attrib['height']))
w=int(image.attrib['width'])
image.attrib['height']=str(h*2)
image.attrib['width']=str(w*2)
打印lxml.html.tostring(etree)
给出:

。使用以下内容正确解析它

import lxml.html
html=“”
etree=lxml.html.fromstring(html)
images=etree.xpath(“//img”)
对于图像中的图像:
h=int(image.attrib['height']))
w=int(image.attrib['width'])
image.attrib['height']=str(h*2)
image.attrib['width']=str(w*2)
打印lxml.html.tostring(etree)
给出:


尝试使用正则表达式解析HTML不会带来任何好处。不管你做什么,它最终都会崩溃

因此,使用一个html解析器,比如python的HTMLParser,它将解码所有html文本,您只需将其打印出来并进行更改


另一方面,像您正在做的那样修改html看起来很可疑。您可能正在做一些非常困难的事情。

尝试使用正则表达式解析html不会带来任何好处。无论您做什么,它最终都会崩溃

因此,使用一个html解析器,比如python的HTMLParser,它将解码所有html文本,您只需将其打印出来并进行更改


另一方面,像你正在做的那样修改html看起来很可疑。你可能正在做一些非常困难的事情。

再次,这项任务应该由html解析器(如建议和)完美解决。
如果仍要使用正则表达式,可以使用此正则表达式:

将匹配以下组:

  • 第1组:
    “宽度”
  • 第二组:
    “10”
  • 第三组:
    “高度”
  • 第四组:
    “111”
在文本中:
它将匹配:

  • 第一组:
    “高度”
  • 第二组:
    “111”
  • 第三组:
    “宽度”
  • 第四组:
    “10”
现在,无论
width
是在
height
之前,还是在
height
之前,它都是匹配的,我认为这4组在进行替换时为您提供了足够的信息

编辑:

我捕获了组
height
width
,以便您知道哪个值首先匹配(否则,如果您获得
111
10
,您将不知道哪个值是
height
width
),但我不认为这在您的情况下是必要的,因为您所要做的就是复制这两个值,但是如果您希望在不同的值中增加高度和宽度,那么这可能会很有用。

再次,这项任务应该由HTML解析器(如建议的和建议的)完美解决。
如果仍要使用正则表达式,可以使用此正则表达式:

将匹配以下组:

  • 第1组:
    “宽度”
  • 第二组:
    “10”
  • 第三组:
    “高度”
  • 第四组:
    “111”
在文本中:
它将匹配:

  • 第一组:
    “高度”
  • 第二组:
    “111”
  • 第三组:
    “宽度”
  • 第四组:
    “10”
现在,无论
width
是在
height
之前,还是在
height
之前,它都是匹配的,我认为这4组在进行替换时为您提供了足够的信息

编辑:
我捕获了组
height
width
,以便您知道哪个值首先匹配(否则,如果您获得
111
10
,您将不知道哪个值是
height
width
),但我认为这在您的情况下不是必需的,因为您所要做的就是复制两个值,但在您需要在di中增加高度和宽度的情况下可能会很有用
>>> from BeautifulSoup import BeautifulSoup
>>> ht = '<html><head><title>foo</title></head><body><p>whatever: <img src="foo/img.png" height="111" width="22" /></p><ul><li><img src="foo/img2.png" height="32" width="44" /></li></ul></body></html>'
>>> soup = BeautifulSoup(ht)
>>> soup
<html><head><title>foo</title></head><body><p>whatever: <img src="foo/img.png" height="111" width="22" /></p><ul><li><img src="foo/img2.png" height="32" width="44" /></li></ul></body></html>
>>> soup.findAll('img')
[<img src="foo/img.png" height="111" width="22" />, <img src="foo/img2.png" height="32" width="44" />]
>>> for img in soup.findAll('img'):
...     ht = int(img['height'])
...     wi = int(img['width'])
...     img['height'] = str(ht * 2)
...     img['width'] = str(wi * 2)
...     
... 
>>> print soup.prettify()
<html>
 <head>
  <title>
   foo
  </title>
 </head>
 <body>
  <p>
   whatever:
   <img src="foo/img.png" height="222" width="44" />
  </p>
  <ul>
   <li>
    <img src="foo/img2.png" height="64" width="88" />
   </li>
  </ul>
 </body>
 </html>
>>> 
import lxml.html

html = '<img src = "werwerwe" height="111" width="10" />'

etree = lxml.html.fromstring(html)

images = etree.xpath('//img')
for image in images:
    h = int(image.attrib['height'])
    w = int(image.attrib['width'])
    image.attrib['height'] = str(h*2)
    image.attrib['width'] = str(w*2)

print lxml.html.tostring(etree)