[英]Regex extracting sub string python
我正在尝试从一个精确的点提取一个子字符串,直到一个特殊的字符“,这是字符串:
element = '<div class="s-suggestion" data-alias="aps" data-crid="2AZHZA23OLYLF" data-isfb="false" data-issc="false" data-keyword="aa battery plus" data-nid="" data-reftag="nb_sb_ss_i_6_2" data-store="" data-type="a9" id="issDiv5"><span class="s-heavy"></span>ab<span class="s-heavy">reva cold sore treatment</span></div>'
我要提取的部分是关键字from:data-keyword =“till:the next”symbol,所以在这种情况下:aa battery plus
但是我只是得到了一封信,当用左边和右边用\\ b分隔符和方括号限制字符串时。
我试图使用re.findall()方法
import re
element = '<div class="s-suggestion" data-alias="aps" data-crid="2AZHZA23OLYLF" data-isfb="false" data-issc="false" data-keyword="aa batteries plus" data-nid="" data-reftag="nb_sb_ss_i_6_2" data-store="" data-type="a9" id="issDiv5"><span class="s-heavy"></span>ab<span class="s-heavy">reva cold sore treatment</span></div>'
z = re.search(r'[\bdata-keyword="\b,'""']',element).group(0)
print(z)
这就是我得到的:
d
Process finished with exit code 0
我如何只提取关键字? IE:aa电池加
如果您想要两个字符串之间的文本,您将需要使用此正则表达式格式。
import re
element = '<div class="s-suggestion" data-alias="aps" data-crid="2AZHZA23OLYLF" data-isfb="false" data-issc="false" data-keyword="aa batteries plus" data-nid="" data-reftag="nb_sb_ss_i_6_2" data-store="" data-type="a9" id="issDiv5"><span class="s-heavy"></span>ab<span class="s-heavy">reva cold sore treatment</span></div>'
z = re.search(r'data-keyword="(.*?)"', element).group(1)
print(z)
使用Regex解析HTML不是一个好主意。 相反,你可以使用像BeautifulSoup这样的html解析器。
例如:
from bs4 import BeautifulSoup
element = '<div class="s-suggestion" data-alias="aps" data-crid="2AZHZA23OLYLF" data-isfb="false" data-issc="false" data-keyword="aa battery plus" data-nid="" data-reftag="nb_sb_ss_i_6_2" data-store="" data-type="a9" id="issDiv5"><span class="s-heavy"></span>ab<span class="s-heavy">reva cold sore treatment</span></div>'
soup = BeautifulSoup(element, "html.parser")
print(soup.find("div", class_="s-suggestion")["data-keyword"])
输出:
aa battery plus
你不需要正则表达式。 您可以使用内置函数find(substring,begin,end)
搜索'data-keyword'的索引。 然后搜索以下每个括号的索引,并对这些括号之间的文本进行切片。
i_key = element.find('data-keyword')
i_1 = element.find('"', i_key)
i_2 = element.find('"', i_1+1)
z = element[i_1+1:i_2]
有关查找功能的更多信息。
这个表达式可能在这里起作用,即使它可能不是最好的想法,我们可能想要使用这种方法来解决问题,但是如果我们必须:
data-keyword="\s*([^"]+?)\s*"
也可能在我们想要的数据之前和之后删除不需要的空格。
# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility
import re
regex = r"data-keyword=\"\s*([^\"]+?)\s*\""
test_str = ("<div class=\"s-suggestion\" data-alias=\"aps\" data-crid=\"2AZHZA23OLYLF\" data-isfb=\"false\" data-issc=\"false\" data-keyword=\"aa batteries plus\" data-nid=\"\" data-reftag=\"nb_sb_ss_i_6_2\" data-store=\"\" data-type=\"a9\" id=\"issDiv5\"><span class=\"s-heavy\"></span>ab<span class=\"s-heavy\">reva cold sore treatment</span></div>\n"
"<div class=\"s-suggestion\" data-alias=\"aps\" data-crid=\"2AZHZA23OLYLF\" data-isfb=\"false\" data-issc=\"false\" data-keyword=\" aa batteries plus \" data-nid=\"\" data-reftag=\"nb_sb_ss_i_6_2\" data-store=\"\" data-type=\"a9\" id=\"issDiv5\"><span class=\"s-heavy\"></span>ab<span class=\"s-heavy\">reva cold sore treatment</span></div>")
matches = re.finditer(regex, test_str, re.MULTILINE)
for matchNum, match in enumerate(matches, start=1):
print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))
for groupNum in range(0, len(match.groups())):
groupNum = groupNum + 1
print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))
# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.
Match 1 was found at 105-137: data-keyword="aa batteries plus"
Group 1 found at 119-136: aa batteries plus
Match 2 was found at 417-458: data-keyword=" aa batteries plus "
Group 1 found at 435-452: aa batteries plus
jex.im可视化正则表达式:
虽然我完全同意之前的回答,但您也可以考虑下一个解决方案:
element.split('data-keyword="')[-1].split('" data-nid')[0]
当您需要解析“结构化”输入时,这可能被认为非常方便...
你可以使用re.findall()
函数:
import re
element = '<div class="s-suggestion" data-alias="aps" data-crid="2AZHZA23OLYLF" data-isfb="false" data-issc="false" data-keyword="aa battery plus" data-nid="" data-reftag="nb_sb_ss_i_6_2" data-store="" data-type="a9" id="issDiv5"><span class="s-heavy"></span>ab<span class="s-heavy">reva cold sore treatment</span></div>'
output = re.findall(r'data-keyword="(.*?)"', element)[0]
print(output)
产量
电池加
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.