python中的可选单词regex
我试图创建一个正则表达式,从python中的html页面中提取电话,街道地址,页面值(9440717256,H.No.3-11-62,RTC Colony..)。这三个字段是可选的,我尝试了这个正则表达式,但输出不一致python中的可选单词regex,python,regex,Python,Regex,我试图创建一个正则表达式,从python中的html页面中提取电话,街道地址,页面值(9440717256,H.No.3-11-62,RTC Colony..)。这三个字段是可选的,我尝试了这个正则表达式,但输出不一致 telephone\S+>(.+)</em>.*(?:streetAddress\S+(.+)</span>)?.*(?:pages\S+>(.+)</a></span>)? telephone\S++>(.+).*(
telephone\S+>(.+)</em>.*(?:streetAddress\S+(.+)</span>)?.*(?:pages\S+>(.+)</a></span>)?
telephone\S++>(.+).*(:streetAddress\S++)(.+)?.*(:pages\S++>(.+)?
示例字符串
<em phone="**telephone**">9440717256</em></div></div></li><li class="row"><i class="icon-sm icon-address"></i><div class="profile-details"><strong>Address</strong><div class="profi`enter code here`le-child"><address itemprop="address" itemscope="" itemtype="http://schema.org/PostalAddress" class="data-item"><span itemprop="**streetAddress**">H.No. 3-11-62, RTC Colony</span>, <span>Vastu Colony, </span><span class="text-black" itemprop="addressLocality"><a href="/hyderabad/lal-bahadur-nagar/allcategory.aspx" title="**Pages**">Lal Bahadur Nagar</a></span>
9440717256地址
有人能帮我构建regex吗?如果你知道HTML提供者,regex可以安全使用,里面的代码是什么样子的 然后,只需使用替换和命名的捕获组
telephone[^>]*>(?P<Telephone>[^<]+)|streetAddress[^>]*>(?P<Address>[^<]+)|Pages[^>]*>(?P<Pages>[^<]+)
粘贴正则表达式代码部分:
p = re.compile(ur'''telephone[^<]*> # Looking for telephone
(?P<Telephone>[^<]+) # Capture telephone (all text up to the next tag)
|
streetAddress[^<]*> # Looking for streetAddress
(?P<Address>[^<]+) # Capture address (all text up to the next tag)
|
Pages[^<]*> # Looking for Pages
(?P<Pages>[^<]+) # Capture Pages (all text up to the next tag)''', re.IGNORECASE | re.VERBOSE)
test_str = "YOUR STRING"
print filter(None, [x.group("Telephone") for x in re.finditer(p, test_str)])
print filter(None, [x.group("Address") for x in re.finditer(p, test_str)])
print filter(None, [x.group("Pages") for x in re.finditer(p, test_str)])
考虑到您的输入不是有效的HTML,并且可能会发生更改,您可以使用类似的HTML解析器但是如果您的输入发生变化,则必须调整这些简单的选择器
from bs4 import BeautifulSoup
h = """<em phone="**telephone**">9440717256</em></div></div></li><li class="row"><i class="icon-sm icon-address"></i><div class="profile-details"><strong>Address</strong><div class="profi`enter code here`le-child"><address itemprop="address" itemscope="" itemtype="http://schema.org/PostalAddress" class="data-item"><span itemprop="**streetAddress**">H.No. 3-11-62, RTC Colony</span>, <span>Vastu Colony, </span><span class="text-black" itemprop="addressLocality"><a href="/hyderabad/lal-bahadur-nagar/allcategory.aspx" title="**Pages**">Lal Bahadur Nagar</a></span>"""
soup = BeautifulSoup(h)
输出:
9440717256
H.No. 3-11-62, RTC Colony
Lal Bahadur Nagar
请不要这样做!会发生的。你需要一个HTML解析器,然后去寻找正确的字段。@Shashank然后你应该用正则表达式来回答这个问题。玩得开心@Shashank:你缺少的是他的文章的中间部分,他说用正则表达式解析HTML通常是个坏主意。从已知上下文中提取字符串和HTML解析有很大区别。我看不出像这样的正则表达式比HTML解析器有什么优势。现在这个正则表达式,还不错。如果您将其置于详细模式,添加一些注释和缩进等,它可能非常可读(尽管它的单行形式不可读)。问题是当您发现它“不太正确”时,因为有时HTML有一个额外的标记或其他东西。因此,您添加了一个分支或组。明天你再加一个。一开始,一切都很好。通往地狱的路是用善意铺成的。下周,您将使用regex101.com测试您的否定前瞻断言。下个月,你的正则表达式是递归的。@Tichodroma:请用HTML解析器发布你的答案。凯文:正如我在回答的开头所提到的,如果你知道你得到的是什么类型的HTML,那么就可以使用它。如果代码更改,属性名称更改,您也需要修改解析器。如果问题包含有效的HTML,我会这样做。没有。但我没有提供答案并不能证明使用正则表达式是一个好主意。尽管我之前发表了评论,但这可能是解决当前问题的最佳方法+1如果在讨论结束时能达成协议总是很好的:)@Tichodroma-谢谢,这看起来很简单。你能告诉我们如何获取值(9440717256,H.No.3-11-62,RTC Colony…)而不是电话,**街道地址你能编辑你的问题,让我们知道你真正想要什么吗?@abhishekkurasala我已经更改了我的答案。
from bs4 import BeautifulSoup
h = """<em phone="**telephone**">9440717256</em></div></div></li><li class="row"><i class="icon-sm icon-address"></i><div class="profile-details"><strong>Address</strong><div class="profi`enter code here`le-child"><address itemprop="address" itemscope="" itemtype="http://schema.org/PostalAddress" class="data-item"><span itemprop="**streetAddress**">H.No. 3-11-62, RTC Colony</span>, <span>Vastu Colony, </span><span class="text-black" itemprop="addressLocality"><a href="/hyderabad/lal-bahadur-nagar/allcategory.aspx" title="**Pages**">Lal Bahadur Nagar</a></span>"""
soup = BeautifulSoup(h)
def find_phone(tag):
return tag.has_attr("phone") and tag.get("phone") == "**telephone**"
def find_streetAddress(tag):
return tag.has_attr("itemprop") and tag.get("itemprop") == "**streetAddress**"
def find_pages(tag):
return tag.has_attr("title") and tag.get("title") == "**Pages**"
print(soup.find(find_phone).string)
print(soup.find(find_streetAddress).string)
print(soup.find(find_pages).string)
9440717256
H.No. 3-11-62, RTC Colony
Lal Bahadur Nagar