Javascript 忽略正则表达式中的常规HTML标记

Javascript 忽略正则表达式中的常规HTML标记,javascript,python,regex,vim,Javascript,Python,Regex,Vim,我需要在丑陋的HTML文件的文本中找到模式。这很难看,因为每个字符都被包装在一个绝对定位的中,并且每个都在自己的行中,如下所示: <span style="position:absolute; color:black; left:422px; top:3497px; font-size:21.6px;">M</span> <span style="position:absolute; color:black; left:440px; top:3497px; font

我需要在丑陋的HTML文件的文本中找到模式。这很难看,因为每个字符都被包装在一个绝对定位的
中,并且每个
都在自己的行中,如下所示:

<span style="position:absolute; color:black; left:422px; top:3497px; font-size:21.6px;">M</span>
<span style="position:absolute; color:black; left:440px; top:3497px; font-size:21.6px;">T</span>
<span style="position:absolute; color:black; left:452px; top:3497px; font-size:21.6px;">V</span>
<span style="position:absolute; color:black; left:464px; top:3497px; font-size:21.6px;"> </span>
<span style="position:absolute; color:black; left:470px; top:3497px; font-size:21.6px;">N</span>
<span style="position:absolute; color:black; left:484px; top:3497px; font-size:21.6px;">e</span>
<span style="position:absolute; color:black; left:493px; top:3497px; font-size:21.6px;">t</span>
<span style="position:absolute; color:black; left:499px; top:3497px; font-size:21.6px;">w</span>
<span style="position:absolute; color:black; left:513px; top:3497px; font-size:21.6px;">o</span>
<span style="position:absolute; color:black; left:523px; top:3497px; font-size:21.6px;">r</span>
<span style="position:absolute; color:black; left:531px; top:3497px; font-size:21.6px;">k</span>
<span style="position:absolute; color:black; left:541px; top:3497px; font-size:21.6px;">s</span>
<span style="position:absolute; color:black; left:549px; top:3497px; font-size:21.6px;">,</span>
<span style="position:absolute; color:black; left:554px; top:3497px; font-size:21.6px;"> </span>
<span style="position:absolute; color:black; left:559px; top:3497px; font-size:21.6px;">I</span>
<span style="position:absolute; color:black; left:566px; top:3497px; font-size:21.6px;">n</span>
<span style="position:absolute; color:black; left:577px; top:3497px; font-size:21.6px;">c</span>
<span style="position:absolute; color:black; left:586px; top:3497px; font-size:21.6px;">.</span>
<span style="position:absolute; color:black; left:592px; top:3497px; font-size:21.6px;">,</span>
<span style="position:absolute; color:black; left:597px; top:3497px; font-size:21.6px;"> </span>
<span style="position:absolute; color:black; left:602px; top:3497px; font-size:21.6px;">1</span>
<span style="position:absolute; color:black; left:613px; top:3497px; font-size:21.6px;">5</span>
<span style="position:absolute; color:black; left:623px; top:3497px; font-size:21.6px;">2</span>
<span style="position:absolute; color:black; left:634px; top:3497px; font-size:21.6px;"> </span>
<span style="position:absolute; color:black; left:639px; top:3497px; font-size:21.6px;">F</span>
<span style="position:absolute; color:black; left:650px; top:3497px; font-size:21.6px;">.</span>
<span style="position:absolute; color:black; left:656px; top:3497px; font-size:21.6px;">3</span>
<span style="position:absolute; color:black; left:666px; top:3497px; font-size:21.6px;">d</span>
<span style="position:absolute; color:black; left:677px; top:3497px; font-size:21.6px;"> </span>
<span style="position:absolute; color:black; left:682px; top:3497px; font-size:21.6px;">1</span>
<span style="position:absolute; color:black; left:693px; top:3497px; font-size:21.6px;">2</span>
<span style="position:absolute; color:black; left:703px; top:3497px; font-size:21.6px;">0</span>
<span style="position:absolute; color:black; left:714px; top:3497px; font-size:21.6px;">9</span>
<span style="position:absolute; color:black; left:724px; top:3497px; font-size:21.6px;"> </span>
<span style="position:absolute; color:black; left:729px; top:3497px; font-size:21.6px;">(</span>
<span style="position:absolute; color:black; left:736px; top:3497px; font-size:21.6px;">9</span>
<span style="position:absolute; color:black; left:747px; top:3496px; font-size:13.6px;">t</span>
<span style="position:absolute; color:black; left:751px; top:3496px; font-size:13.6px;">h</span>
<span style="position:absolute; color:black; left:757px; top:3497px; font-size:21.6px;"> </span>
<span style="position:absolute; color:black; left:763px; top:3497px; font-size:21.6px;">C</span>
<span style="position:absolute; color:black; left:777px; top:3497px; font-size:21.6px;">i</span>
<span style="position:absolute; color:black; left:782px; top:3497px; font-size:21.6px;">r</span>
<span style="position:absolute; color:black; left:789px; top:3497px; font-size:21.6px;">.</span>
<span style="position:absolute; color:black; left:795px; top:3497px; font-size:21.6px;"> </span>
<span style="position:absolute; color:black; left:800px; top:3497px; font-size:21.6px;">1</span>
<span style="position:absolute; color:black; left:810px; top:3497px; font-size:21.6px;">9</span>
<span style="position:absolute; color:black; left:821px; top:3497px; font-size:21.6px;">9</span>
<span style="position:absolute; color:black; left:831px; top:3497px; font-size:21.6px;">8</span>
<span style="position:absolute; color:black; left:842px; top:3497px; font-size:21.6px;">)</span>
我可以编写一个详细的正则表达式来忽略每个HTML标记,但这很快就会变得不可行(例如,如果每个数字前后都有一个HTML标记,则很难匹配
[0-9]\+

我可以使用类似于
%s/\(.*\)/\1/g
的方法去除HTML,但这也不起作用,因为我需要保留格式

我明白了。但是我不需要解析任意的HTML;我只需要处理一组已知的标签。有没有一种优雅的方法可以做到这一点?或者我应该放弃正则表达式而使用XPath解析器之类的东西


我对任何语言都持开放态度,但我更喜欢使用Python、JavaScript或Vim。

好吧,我会将文本节点提取为一个简单字符串,匹配它,然后返回DOM树以检索初始HTML。诸如此类:

import lxml.html, lxml.etree
import re

with open('foo.html') as f:
    source = lxml.html.parse(f)

letters = source.findall('//span')
string = ''.join(s.text for s in letters)

match = re.search(r'[0-9]+ F\.3d [0-9]+', string)
assert match is not None

start, end = match.span()
html = '\n'.join(lxml.etree.tostring(el).decode('utf8')
                 for el in letters[start:end])

print('<a href="foo">{}</a>'.format(html))
导入lxml.html,lxml.etree
进口稀土
将open('foo.html')作为f:
source=lxml.html.parse(f)
letters=source.findall(“//span”)
string=''.join(以字母表示的s的s.text)
匹配=重新搜索(r'[0-9]+F\.3d[0-9]+',字符串)
断言匹配不是无
start,end=match.span()
html='\n'.join(lxml.etree.tostring(el.decode('utf8'))
对于el,字母为[开始:结束])
打印(“”.格式(html))

请注意,循环中的
tostring()
可能不是最佳性能。相反,您应该构建
a
元素,在其中添加字母,并在
a
元素上调用
tostring()

好的,我将把文本节点提取到一个简单字符串中,匹配它,然后返回DOM树以检索初始HTML。诸如此类:

import lxml.html, lxml.etree
import re

with open('foo.html') as f:
    source = lxml.html.parse(f)

letters = source.findall('//span')
string = ''.join(s.text for s in letters)

match = re.search(r'[0-9]+ F\.3d [0-9]+', string)
assert match is not None

start, end = match.span()
html = '\n'.join(lxml.etree.tostring(el).decode('utf8')
                 for el in letters[start:end])

print('<a href="foo">{}</a>'.format(html))
导入lxml.html,lxml.etree
进口稀土
将open('foo.html')作为f:
source=lxml.html.parse(f)
letters=source.findall(“//span”)
string=''.join(以字母表示的s的s.text)
匹配=重新搜索(r'[0-9]+F\.3d[0-9]+',字符串)
断言匹配不是无
start,end=match.span()
html='\n'.join(lxml.etree.tostring(el.decode('utf8'))
对于el,字母为[开始:结束])
打印(“”.格式(html))

请注意,循环中的
tostring()
可能不是最佳性能。相反,您应该构建
a
元素,在其中添加字母,并在
a
元素上调用
tostring()

此代码缺少大量错误处理,并且依赖于严格的输入格式,但请考虑:

import re
import os

html = '''<span style="position:absolute; color:black; left:422px; top:3497px; font-size:21.6px;">M</span>
<span style="position:absolute; color:black; left:440px; top:3497px; font-size:21.6px;">T</span>
<span style="position:absolute; color:black; left:452px; top:3497px; font-size:21.6px;">V</span>
... (Lines omitted)
<span style="position:absolute; color:black; left:842px; top:3497px; font-size:21.6px;">)</span>
'''

# This is sloppy, but if your input format remains the same should work...
chars = ''.join([line[line.find('>') + 1] for line in html.splitlines()])
# chars => "MTV Networks, Inc., 152 F.3d 1209 (9th Cir. 1998)"

# Use regex to search chars
mat = re.search(r'\d+ F\.3d \d+', chars)

# Extract lines from html based on the start and end positions of the regex match
block = html.splitlines()[mat.start():mat.end()]

# Wrap the lines with your anchor tag    
block = ['<a href="http://www.stackoverflow.com/>'] + block + ['</a>']

# Print the list
print os.linesep.join(block)
重新导入
导入操作系统
html=''我是
T
v
... (省略行)
)
'''
#这是草率的,但如果您的输入格式保持不变,应该可以。。。
chars=''.join([line[line.find('>')+1]表示html.splitlines()中的行)
#chars=>“MTV网络公司,第三版第152卷第1209页(1998年第九巡回法庭)”
#使用正则表达式搜索字符
mat=re.search(r'\d+F\.3d\d+',字符)
#根据正则表达式匹配的开始和结束位置从html中提取行
block=html.splitlines()[mat.start():mat.end()]
#用你的锚定标签把线包起来
块=[']
#打印列表
打印os.linesep.join(块)
它首先提取
标记中的单个字符,并将它们放入字符串中。然后它在该字符串中搜索正则表达式(为python的
re
模块而修改)

由于
chars
字符串中字符的位置与
html
中相应行的行号完全对应,因此我们可以使用
chars
字符串中匹配的开始和结束位置来选择要换行的
html

我们在
列表的开头和结尾插入元素,对应于您的锚定标记,并将其打印出来


只要您的输入保持与指定的完全一致,就不需要调用DOM解析器或任何非常复杂的东西——尽管可能需要类似的东西。

此代码缺少大量错误处理,并且依赖于严格的输入格式,但请考虑:

import re
import os

html = '''<span style="position:absolute; color:black; left:422px; top:3497px; font-size:21.6px;">M</span>
<span style="position:absolute; color:black; left:440px; top:3497px; font-size:21.6px;">T</span>
<span style="position:absolute; color:black; left:452px; top:3497px; font-size:21.6px;">V</span>
... (Lines omitted)
<span style="position:absolute; color:black; left:842px; top:3497px; font-size:21.6px;">)</span>
'''

# This is sloppy, but if your input format remains the same should work...
chars = ''.join([line[line.find('>') + 1] for line in html.splitlines()])
# chars => "MTV Networks, Inc., 152 F.3d 1209 (9th Cir. 1998)"

# Use regex to search chars
mat = re.search(r'\d+ F\.3d \d+', chars)

# Extract lines from html based on the start and end positions of the regex match
block = html.splitlines()[mat.start():mat.end()]

# Wrap the lines with your anchor tag    
block = ['<a href="http://www.stackoverflow.com/>'] + block + ['</a>']

# Print the list
print os.linesep.join(block)
重新导入
导入操作系统
html=''我是
T
v
... (省略行)
)
'''
#这是草率的,但如果您的输入格式保持不变,应该可以。。。
chars=''.join([line[line.find('>')+1]表示html.splitlines()中的行)
#chars=>“MTV网络公司,第三版第152卷第1209页(1998年第九巡回法庭)”
#使用正则表达式搜索字符
mat=re.search(r'\d+F\.3d\d+',字符)
#根据正则表达式匹配的开始和结束位置从html中提取行
block=html.splitlines()[mat.start():mat.end()]
#用你的锚定标签把线包起来
块=[']
#打印列表
打印os.linesep.join(块)
它首先提取
标记中的单个字符,并将它们放入字符串中。然后它在该字符串中搜索正则表达式(为python的
re
模块而修改)

由于
chars
字符串中字符的位置与
html
中相应行的行号完全对应,因此我们可以使用
chars
字符串中匹配的开始和结束位置来选择要换行的
html

我们在
列表的开头和结尾插入元素,对应于您的锚定标记,并将其打印出来


只要您的输入保持与指定的完全一致,就不需要调用DOM解析器或任何非常复杂的东西——尽管可能需要类似的东西。

下面是一个使用awk的解决方案:

$ cat mornin.awk
NR == FNR {
    gsub("</?span[^<]*>","",$0)
    s = s $0
    next
}

FNR == 1 {
    i = match(s, "[0-9]+ F\.3d [0-9]+")
    len = RLENGTH
    print "<a href=\"http://www.stackoverflow.com/\">"
}

FNR == i, FNR == (i + RLENGTH - 1)

END {
    print "</a>"
}
$cat mornin.awk
NR==FNR{

gsub(“以下是使用awk的解决方案:

$ cat mornin.awk
NR == FNR {
    gsub("</?span[^<]*>","",$0)
    s = s $0
    next
}

FNR == 1 {
    i = match(s, "[0-9]+ F\.3d [0-9]+")
    len = RLENGTH
    print "<a href=\"http://www.stackoverflow.com/\">"
}

FNR == i, FNR == (i + RLENGTH - 1)

END {
    print "</a>"
}
$cat mornin.awk
NR==FNR{

gsub(“我在输入中看不到这个”152 F.3d 1209“。你确定vim regex[0-9]\+F\.3d[0-9]\+与示例输入中的任何内容匹配吗?或者我缺少一些内容。@VinodSharma,将输入向右滚动,然后通过readin查找”152 F.3d 1209“