在字符串中搜索特定结构

时间:2017-10-17 08:35:16

标签: html python-3.x

我正在开发一个项目,我想将nwodkram文件转换为HTML文件。在nwodkram中,URL在表单上给出

[www.stackoverflow.com](This is StackOverflow)
HTML中的

对应

<a href='www.stackoveflow.com'>This is StackOverflow<\a>.

我可以这样做:

def parser_nwodkram(text):
    string = list(text)

    counter = 0     # Count number of characters in string

    for char in string:
        if char == '[':
            sq_par_0 = counter      # Location of square parenthesis 0
        if char == ']':
            if 'sq_par_0' in locals():
                url = "".join(string[sq_par_0+1:counter])
        if char == '(':
            if 'url' in locals():
                par_0 = counter
        if char == ')':
            if 'par_0' in locals():
                url_ref = r"<a href='{}'>{}<\a>".format(\
                          "".join(string[par_0+1:counter]), url)
            string[counter] = url_ref
            del string[sq_par_0:counter]

        counter += 1  

    return "".join(string)

但是我想更优雅高效,有没有办法在字符串中搜索某个结构,在这种情况下

[...](...)?

2 个答案:

答案 0 :(得分:2)

您可以使用正则表达式实现此功能。您可以在re.search中为此创建重新组,并获取这两个元素。例如:

>>> a = '[www.stackoverflow.com](This is StackOverflow)'
>>> import re
>>> match = re.search('(\[.*?\])(\(.*?\))',a)
>>> match.group()
'[www.stackoverflow.com](This is StackOverflow)'
>>> match.group(1)
'[www.stackoverflow.com]'
>>> match.group(2)
'(This is StackOverflow)'
>>> 

对于你的问题,它就像是:

import re
def parser_nwodkram(text):
    match = re.search('\[(.*?)\]\((.*?)\)',text)
    url_ref = "<a href='%s'>%s</a>" % (match.group(1), match.group(2))
    print url_ref

parser_nwodkram('[www.stackoverflow.com](This is StackOverflow)')

输出:

<a href='www.stackoverflow.com'>This is StackOverflow</a>

此外,您可以为正则表达式(此处为AttributeError)实现正确的异常处理,以处理未正确给出文本的情况

答案 1 :(得分:0)

您始终可以使用来自here

的python的内置regexp