【问题标题】:Regex how to use 'or' for string matching正则表达式如何使用“或”进行字符串匹配
【发布时间】:2012-01-02 20:43:29
【问题描述】:

我想在 Python 上使用正则表达式解析网页并查找特定模式。

我的示例页面有:

<input type="checkbox" name="some name....">
<input type="text", name="somemore name...">
<input type="radio" name="other name...">

我想找到所有匹配的 name 单选和复选框输入值。

<input type="checkbox" name="(.*?)".*?>
<input type="radio" name="(.*?)".*?>

但我不知道如何将这些组合成一个正则表达式?

编辑:这个问题可能会转向其他方向。但我最好告诉我我想做什么,我选择的正则表达式是否真的适合那个...

我必须查询一个订阅者,并获得一些关于该订阅者的基本信息以及该订阅者的可用贷款和费用列表。相关模块有许多脚本可以使用正则表达式完成此类工作。我还在代码中的某些部分使用了 SGMLparser。但我有时会看到 SGML 解析器无法解析 HTML(没有挖掘它为什么会失败,但基本原因是 unexpected char 类型错误)。所以,我必须确保我要么处理所有类型的 HTML 代码,要么继续使用正则表达式。

结论:使用HTMLParser 是最好的选择,而使用regex 是一个非常糟糕的主意......这就是我从中得到的这个问题...但是由于 问题本身 更多的是关于 regex matcihng 然后 regex 在 thml 中的用法,我决定接受 正则表达式的答案...

【问题讨论】:

标签: python regex


【解决方案1】:
<input type="(checkbox|radio)" name="(?P<name>.*?)".*?>

我还在其中放了一个捕获组名称以便于提取。

但旧规则适用,不要使用正则表达式来解析 html。它非常脆弱。如果您正在解析的代码在一夜之间更改为&lt;input class="aha" type="checkbox" name="some name...."&gt; 怎么办?使用 HTMLParser 类或 BeautifulSoup。

http://docs.python.org/library/htmlparser.html

http://www.crummy.com/software/BeautifulSoup/

【讨论】:

    【解决方案2】:

    这个?

    <input type="(?:checkbox|radio)" name="(.*?)".*?>
    

    虽然这可行……但它不是很健壮……

    【讨论】:

      【解决方案3】:

      您永远不应该使用 Regex 处理 HTML...这里有很多线程向您展示了原因。也许您可以查看this 之前的 SO 线程,其中讨论了 Python 的各种 HTML 解析器。

      【讨论】:

      • 谢谢,但我需要的比我在这里写的更复杂。所以这个原因和其他一些原因,我最好的选择是使用正则表达式。
      • 相信我。相信我们。您的需求几乎肯定不是独一无二的。如果是,请在问题中向我们提供更多详细信息(否则可能会作为重复项关闭)
      • 可能是它的思想相当严格,但直到今天所有的工作都是以这种方式完成的:D 可能这就是为什么我不想改变系统的基本结构。我需要做的是,查询一些 subscriber id 并获取一些订阅者信息和他的贷款列表...
      • 是的,但是数据来自哪里?如果这是从内部软件获取数据,那么您将增加产品的脆弱性并为公司招致技术债务。如果它是从外部获取数据,那么您将损害业务连续性,并让自己在未来遇到麻烦。
      • 数据来自我们系统之外。比如浏览 Stackoverflow 和检查问题,然后返回我感兴趣的问题列表......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-30
      • 1970-01-01
      相关资源
      最近更新 更多