1

使用python,我想“教育”纯文本输入的引号并将它们转换为上下文语法。这是一个(递归)示例:

原文:

Using python, I would like "educate" quotes of 
a plain text input and turn them into the Context syntax. 
Here is a (recursive) example:

输出:

Using python, I would like \quotation{educate} quotes of 
a plain text input and turn them into the Context syntax. 
Here is a (recursive) example:

我希望它也能处理嵌套引号:

原文:

Original text: "Using python, I would like 'educate' quotes of 
a plain text input and turn them into the Context syntax. 
Here is a (recursive) example:"

输出:

Original text: \quotation {Using python, I would like \quotation{educate} quotes of 
a plain text input and turn them into the Context syntax. 
Here is a (recursive) example:}

当然,我应该处理边缘情况,例如:

She said "It looks like we are back in the '90s"

上下文引用的规范在这里:

http://wiki.contextgarden.net/Nested_quotations#Nested_quotations_in_MkIV

对这种情况最敏感的方法是什么?非常感谢!

4

2 回答 2

3

This one works with nested quotes, although it does not handle your edge cases

def quote(string):
    text = ''
    stack = []
    for token in iter_tokes(string):
        if is_quote(token):
            if stack and stack[-1] == token: # closing
                text += '}'
                stack.pop()
            else: # opening
                text += '\\quotation{'
                stack.append(token)
        else:
            text += token
    return text

def iter_tokes(string):
    i = find_quote(string)
    if i is None:
        yield string
    else:
        if i > 0:
            yield string[:i]
        yield string[i]
        for q in iter_tokes(string[i+1:]):
            yield q

def find_quote(string):
    for i, char in enumerate(string):
        if is_quote(char):
            return i
    return None

def is_quote(char):
    return char in '\'\"'

def main():
    quoted = None
    with open('input.txt') as fh:
        quoted = quote(fh.read())
    print quoted

main()
于 2013-04-28T15:30:09.730 回答
0

如果您确定原始文本在正确的位置有空格,您可以简单地使用正则表达式:

regexp = re.compile('(?P<opening>(?:^|(?<=\\s))\'(?!\\d0s)|(?<=\\s)")|["\'](?=\\s|$)')

def repl(match):
    if match.group('opening'):
        return '\\quotation{'
    else:
        return '}'

result = re.sub(regexp, repl, s)
于 2013-04-28T11:13:14.173 回答