【问题标题】:How to Insert space between a special character and everything else如何在特殊字符和其他所有内容之间插入空格
【发布时间】:2021-12-20 17:17:18
【问题描述】:

我有一些我正在处理的乳胶文本,我需要清理它以便根据间距正确拆分它。

所以字符串:

\\mathrm l  >\\mathrm li ^ + >\\mathrm mg ^   +>\\mathrm a  \\beta+  \\mathrm co

应该是:

\\mathrm l  > \\mathrm li ^ + > \\mathrm mg ^   + > \\mathrm a  \\beta +  \\mathrm co

所以为了让我分割它,如果它是一个特殊字符,我必须在每个字符之间创建间距。另外我想保持乳胶符号完整为\something

我可以让re.compile([a-zA-Z0-9 \\]) 获取所有特殊字符,但是如何处理插入空格?

我写了一个类似这样的代码,但它在效率方面看起来并不好。 (或者是吗?)

def insert_space(sentence):
    '''
    Add a space around special characters So "x+y +-=y \\latex" becomes: "x + y + - = y \\latex"
    '''
    string = ''
    for i in sentence:
        if (not i.isalnum()) and i not in [' ','\\']:
            string += ' '+i+' '
        else:
            string += i
    return re.sub('\s+', ' ',string)

【问题讨论】:

    标签: python nlp python-re


    【解决方案1】:

    我没有使用过 LaTeX,所以如果您确定 [a-zA-Z0-9 \\] 捕获了所有不是特殊字符的内容,您可以这样做。

    import re
    
    def insert_space(sentence):
        sentence = re.sub(r'(?<! )(?![a-zA-Z0-9 \\])', ' ', sentence)
        sentence = re.sub(r'(?<!^)(?<![a-zA-Z0-9 \\])(?! )', ' ', sentence)
        return sentence
    
    my_string = '\\mathrm l  >\\mathrm li ^ + >\\mathrm mg ^   +>\\mathrm a  \\beta+  \\mathrm co'
    print('before', my_string)
    # before \mathrm l  >\mathrm li ^ + >\mathrm mg ^   +>\mathrm a  \beta+  \mathrm co
    print('after', insert_space(my_string))
    # after \mathrm l  > \mathrm li ^ + > \mathrm mg ^   + > \mathrm a  \beta +  \mathrm co 
    

    第一个regex是:

    • (?&lt;! ) 负片看后面找个空格。
    • (?![a-zA-Z0-9 \\]) 对您指定的字符类进行否定预测。
    • 用空格 ' ' 替换所有这些匹配项。

    第二个regex是:

    • (?&lt;!^) 否定寻找字符串的开头。
    • (?&lt;![a-zA-Z0-9 \\]) 负向查找您指定的字符类。
    • (?! ) 否定前瞻空间。
    • 用空格 ' ' 替换所有这些匹配项。

    因此,它首先找到特殊字符和另一个不是空格的字符之间的所有空格,然后在该位置插入一个空格。

    您还需要包含(?&lt;!^) 的原因是忽略字符串开头和第一个字符之间的位置。否则,它会在开头包含一个额外的空格。

    【讨论】:

    • 比我写的函数快吗?有什么想法吗?
    • 使用timeit('insert_space("\\mathrm l &gt;\\mathrm li ^ + &gt;\\mathrm mg ^ +&gt;\\mathrm a \\beta+ \\mathrm co")', globals=globals()),速度大约是原来的两倍。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-22
    • 2019-10-13
    相关资源
    最近更新 更多