Python库生成正则表达式

Ion*_*lub 12 python regex

是否有任何lib可以采取文本(如html文档)和字符串列表(如某些产品的名称),然后在字符串列表中找到一个模式,并生成一个正则表达式,将提取所有的文本中的字符串(html文档)与它找到的模式匹配?

例如,给定以下html:

<table>
  <tr>
    <td>Product 1</td>
    <td>Product 2</td>
    <td>Product 3</td>
    <td>Product 4</td>
    <td>Product 5</td>
    <td>Product 6</td>
    <td>Product 7</td>
    <td>Product 8</td>
  </tr>
</table>
Run Code Online (Sandbox Code Playgroud)

以及以下字符串列表:

['Product 1', 'Product 2', 'Product 3']
Run Code Online (Sandbox Code Playgroud)

我想要一个可以构建如下所示的正则表达式的函数:

'<td>(.*?)</td>'
Run Code Online (Sandbox Code Playgroud)

然后从html中提取与正则表达式匹配的所有信息.在这种情况下,输出将是:

['Product 1', 'Product 2', 'Product 3', 'Product 4', 'Product 5', 'Product 6', 'Product 7', 'Product 8']
Run Code Online (Sandbox Code Playgroud)

澄清:

我希望函数能够查看样本的周围,而不是样本本身.所以,例如,如果html是:

<tr>
  <td>Word</td>
  <td>More words</td>
  <td>101</td>
  <td>-1-0-1-</td>
</tr>
Run Code Online (Sandbox Code Playgroud)

以及['Word', 'More words']我希望它提取的样本:

['Word', 'More words', '101', '-1-0-1-']
Run Code Online (Sandbox Code Playgroud)

Ben*_*ueg 10

您的要求同时非常具体且非常一般.

除非你自己写,否则我认为你找不到任何图书馆.

另一方面,如果你花费太多时间编写正则表达式,你可以使用一些GUI工具来帮助你构建它们,例如:http: //www.regular-expressions.info/regexmagic.html

但是,如果您只需要从html文档中提取数据,则应考虑使用html解析器,它应该使事情变得更容易.

我建议beautifulsoup在python中解析html文档:https: //pypi.python.org/pypi/beautifulsoup4/4.2.1


Hen*_*ter 6

我很确定在一般情况下(没有迂腐)这个问题的答案是否定的.问题在于,任意文本以及该文本的任意子串都不会严格定义单个正则表达式.

正如一对人提到的那样,函数可以简单地返回.*每组输入.或者它可以为输入字符串返回['desired', 'input', 'strings']正则表达式

'(desired)+|(input)+|(strings)+'
Run Code Online (Sandbox Code Playgroud)

或者其他许多正确但完全无用的结果.

您面临的问题是,为了构建正则表达式,您需要严格定义它.要做到这一点,你需要使用语言描述所需的表达式,就像你正在使用的正则表达式语言一样......字符串加上一个子串列表是不够的(只需查看RegexMagic需要的工具的所有选项)在有限的环境中计算正则表达式!).实际上,这意味着您需要所需的正则表达式,以便有效地计算它.


当然,你总是可以去百万只猴子的路线并尝试以某种方式发展一个合适的正则表达式,但你仍然会遇到需要大量文本输入+预期输出的问题才能获得可行的表达式.此外,它还需要很长时间才能运行,并且可能会在星期天以无用的碎屑六种方式臃肿.你最好自己写一下.


Chi*_*den -2

与其生成正则表达式,不如使用更通用的正则表达式怎么样?如果您的数据仅限于本身不包含元素的元素的内部文本,则与 re.findall 一起使用的正则表达式将生成一个元组列表,其中每个元组是(标记名,文本):

r'<(?P<tag>[^>]*)>([^<>]+?)</(?P=tag)>'
Run Code Online (Sandbox Code Playgroud)

然后,您可以轻松地从每个元组中提取文本。