python中的可选单词regex

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++>(.+).*(

我试图创建一个正则表达式,从python中的html页面中提取电话街道地址页面值(9440717256,H.No.3-11-62,RTC Colony..)。这三个字段是可选的,我尝试了这个正则表达式,但输出不一致

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