Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于生成正则表达式的Python库_Python_Regex - Fatal编程技术网

用于生成正则表达式的Python库

用于生成正则表达式的Python库,python,regex,Python,Regex,是否有任何库可以获取文本(如html文档)和字符串列表(如某些产品的名称),然后在字符串列表中查找模式,并生成正则表达式,以提取文本(html文档)中与其找到的模式匹配的所有字符串 例如,给定以下html: <table> <tr> <td>Product 1</td> <td>Product 2</td> <td>Product 3</td> <td>

是否有任何库可以获取文本(如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>
我想要一个可以构建正则表达式的函数,如下所示:

'<td>(.*?)</td>'
澄清:

我希望函数可以查看样本的周围环境,而不是样本本身。 例如,如果html是:

<tr>
  <td>Word</td>
  <td>More words</td>
  <td>101</td>
  <td>-1-0-1-</td>
</tr>

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

r']*)>([^]+?)'

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

您的需求同时非常具体和一般

我认为除非你自己写,否则你永远找不到适合你的图书馆

另一方面,如果您花太多时间编写正则表达式,可以使用一些GUI工具来帮助您构建它们,如:

<>强>但是,如果只需要从HTML文档中提取数据,就应该考虑使用HTML解析器,它会使事情变得更容易。

我建议使用python解析html文档时使用
beautifulsoup

也许最好使用支持XPath的Python HTML解析器(请参阅),在HTML代码中查找感兴趣的部分,然后记录它们的XPath,或者至少记录多个示例共享的XPath?

我也有类似的问题。Pyparsing是一个很好的工具,可以完全按照您所说的做

它允许你构建一个正则表达式,但要灵活得多。该网站有一些很好的例子

以下是您提出的上述问题的快速脚本:

from pyparsing import *
cell_contents = []
results = []
text_string="""<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>"""

text_string = text_string.splitlines()
for line in text_string:
    anchorStart,anchorEnd = makeHTMLTags("td")
    table_cell = anchorStart + SkipTo(anchorEnd).setResultsName("contents") + anchorEnd
    for tokens,start,end in table_cell.scanString(line):
        cell_contents = ''.join(tokens.contents)
        results.append(cell_contents)

for i in results:
    print i
从pyparsing导入*
单元格内容=[]
结果=[]
text_string=“”
产品1
产品2
产品3
产品4
产品5
产品6
产品7
产品8
"""
text\u string=text\u string.splitlines()
对于文本字符串中的行:
主播开始,主播结束=制作HTMLTAGS(“td”)
table_cell=anchorStart+SkipTo(anchorEnd).setResultsName(“内容”)+anchorEnd
对于令牌,在表_cell.scanString(第行)中开始和结束:
单元格内容=“”.join(标记.contents)
结果.追加(单元格内容)
对于结果中的i:
打印i

我很确定,在一般情况下(不带学究气)这个问题的答案是。问题在于,任意文本以及该文本的任意子字符串集不能严格定义单个正则表达式

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

'(desired)+|(input)+|(strings)+'
或者大量其他琐碎正确但完全无用的结果

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


当然,你总是可以走百万猴子的路线,尝试以某种方式进化出一个合适的正则表达式,但是你仍然会遇到这样的问题:为了得到一个可行的表达式,需要大量的文本样本输入+预期输出。再加上跑步要花很长时间,从周日开始可能会因为无用的碎屑而肿胀六次。你最好自己写。试试这个:


它是用Clojure编写的,不能保证它输出的是最简洁的表达式,但似乎有一些潜力

为什么它不应该构建regex
“产品[1-3]”
?相关:@IonutHulub如果生成的regex也使用了周围的空白:
\s*(*),它不是更“通用”吗\s*
?什么原理告诉算法停止在
td
标记的边界?您是否真的对通用正则表达式感兴趣,或者对发现字符串在HTML或XML样式文档的层次结构中的位置感兴趣?这听起来像是一个问题。您可能应该打开一个StackOverflow问题,询问您的问题,而不是您认为有助于解决您的问题的工具。推断XPath/CSS选择器比推断正则表达式更有意义。此处,此正则表达式对命名组使用python特定语法,但是它们有很多其他的版本,使用不同的语法。Regexmagic不适合我的需要。我已经开始了一个库的工作,我使用beautifulsoup4来解析html。当我有了一个稳定的版本后,我会把它发布到这里。也许这是因为我不够清楚,但我不希望函数通过查看样本来构造正则表达式,而是通过查看样本的周围来构造正则表达式。因此,最终的正则表达式将始终采用以下形式:
在正则表达式之前
+
(.*)
+
在正则表达式之后,
(.*)
将捕获示例。@IonutHulub请求更长的正则表达式不会改变基本问题,也就是说,您希望提供的输入不足以描述正则表达式。我可以想出任意数量的正则表达式,形式为
before+(group)+after
,它们都是“正确的”,没有一个是实际的
['Word', 'More words', '101', '-1-0-1-']
r'<(?P<tag>[^>]*)>([^<>]+?)</(?P=tag)>'
from pyparsing import *
cell_contents = []
results = []
text_string="""<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>"""

text_string = text_string.splitlines()
for line in text_string:
    anchorStart,anchorEnd = makeHTMLTags("td")
    table_cell = anchorStart + SkipTo(anchorEnd).setResultsName("contents") + anchorEnd
    for tokens,start,end in table_cell.scanString(line):
        cell_contents = ''.join(tokens.contents)
        results.append(cell_contents)

for i in results:
    print i
'(desired)+|(input)+|(strings)+'