在分隔符列表上编写循环?

时间:2012-06-19 14:10:55

标签: python regex

我必须在html文件中隔离部分字符串。我以为我可以成功,但数据结构真的很混乱。我是一个非常初学者,所以正则表达式可能是一个坏主意。我可以补充说,逗号或分号不一致,不能被选为分隔符。在任何情况下,我做了什么,让我从一个例子开始。 假设这是放在变量中的html

示例= d1 d2一些东西有些东西d3 d4 d5有些东西

如果分隔符是一致的,我可以使用以下脚本恢复我感兴趣的“一些东西”:

for url in open("url-repository.csv", "rt").readlines():
    variable1 = urllib2.urlopen(url[:-1]).read()
    a = re.compile('d1(.*?)\"d2')
    b = a.search(vqriable1)
    if b:
        c = b.group(1)
        list_of_d1.append(c)

但是,在我必须分析的不同页面中,分隔符并不总是相同,也不总是以相同的顺序。

示例2 = d2有些东西d3 没有 d4有些东西d5

因此,我会问你两件事。假设我创建了一个我在html页面中找到的所有分隔符的列表,

Delimiters_list = [d1, d2, d3]

1是否可以确保脚本查找所有可能的配置,例如d1 + d2,d2 + d6,dn + dn?

2或至少表示第一个术语,并使脚本停止选择链到它遇到的列表的第一个术语?

这对我来说是一个非常困难的问题,我知道我可能不清楚,但我提前感谢那些试图检查并帮助我的人。

2 个答案:

答案 0 :(得分:0)

以下Python示例应该可以解决您的问题。

dels = [d1, d2, d3]
combs = []
for d1 in dels:
    for d2 in dels:
        combs.append(re.compile(d1 + '(.*?)\"' + d2)
for comb in combs:
    check_for_matches(comb, string)

我希望你觉得它很有帮助。

答案 1 :(得分:0)

如果使用交替运算符|,问题并不困难。

    (d1|d2|d3|d4|d25)(.*?)(?=d1|d2|d3|d4|d25)

这样,

  1. 如果需要,您将在第1组中捕获起始分隔符;
  2. 你将非贪婪地捕获第2组中的“某些东西”;
  3. 并且通过使用前瞻断言,您不会“吃掉”下一个分隔符,这样您就可以继续将其余数据与相同的正则表达式进行匹配。
  4. 在此处查看此正则表达式的演示:http://rubular.com/r/DJVegfD3Ul

    注意:可悲的是我不懂Python,所以我不会尝试编写任何代码。但是将所有分隔符加入上面的表单应该是一项微不足道的任务。请参阅下面的评论中的警告。

    <强>更新

    这是我第一次写Python,所以原谅我的错误。

        # start with an array of delimeters
        delimeters = [d1, d2, d3]
    
        # start with a blank string
        regex_delim = ''
    
        # build the "delimiters regex" using alternation
        for delimeter in delimeters:
            regex_delim += re.escape(delimeter) + '|'
    
        # remove the extra '|' at the end
        regex_delim = regex_delim[:-1]
    
        # compile the regex
        regex_obj = re.compile('(' + regex_delim + ')(.*?)(?=' + regex_delim + ')')
    
        # and that should be it!
        for match in regex_obj.finditer(html_str):
            print match.group(2)
    

    如果分隔符中包含特殊字符,则re.escape(delimiter)是必需的。例如,如果您的分隔符为*,则re.escape(...)会返回\*,因此您的分隔符不会转换为正则表达式量词。