Python 2 re.sub issue

时间:2016-01-08 07:57:19

标签: python regex string python-2.7 python-3.4

我得到了一个函数,用HTML标签包围的匹配替换子字符串匹配。这个函数主要使用英语和希腊语的字符串。

功能:

def highlight_text(st, kwlist, start_tag=None, end_tag=None):
    if start_tag is None:
        start_tag = '<span class="nom">'

    if end_tag is None:
        end_tag = '</span>'

    for kw in kwlist:
        st = re.sub(r'\b' + kw + r'\b', '{}{}{}'.format(start_tag, kw, end_tag), st)
    return st

测试字符串是希腊语,除了第一个子字符串[Korais]:st = “KoraisΟΑδαμάντιοςΚοραής(Σμύρνη,27Απριλίου1748 - Παρίσι,6Απριλίου1833),ττνΈλληναςφιλόλογοςμεβαθιάγνώσητου ελληνικούπολιτισμού。ΟΚοραήςείναιέναςαπότουςσημαντικότερουςεκπροσώπουςτουνεοελληνικούδιαφωτισμούκαιμνημονεύεται,ανάμεσασεάλλα,ωςπρωτοπόροςστηνέκδοσηέργωναρχαίαςελληνικήςγραμματείας,αλλάκαιγιατιςγλωσσικέςτουαπόψειςστηνυποστήριξητηςκαθαρεύουσας,σεμιαμετριοπαθήόμωςμορφήτηςμεσκοπό τηνεκκαθάρισητωνπλείστωνξένωνλέξεωνπουυπήρχανστηγλώσσατο λαού“。

测试代码:

kwlist = ['ελληνικού', 'Σμύρνη', 'Αδαμάντιος', 'Korais']
d = highlight_text(st, kwlist, start_tag=None, end_tag=None)
print(d)

当我运行代码[st是上面的字符串]时,只有英文的子字符串被标记。希腊的substr被忽略了。请注意,我在Python 2.7上运行上面的块。当我使用Python 3.4时,所有子字符串都被替换。 另一个问题是,当我使用Flask应用程序运行上述函数时,它会抛出一个错误:正则表达式意外结束。

如果可能的话,如何在不使用外部库的情况下解决上述问题? 两天后我把头发拉了下来。

2 个答案:

答案 0 :(得分:1)

在Python 2.7中,您需要将文本显式转换为Unicode。请参阅下面的固定代码段:

# -*- coding: utf-8 -*-
import re
def highlight_text(st, kwlist, start_tag=None, end_tag=None):
    if start_tag is None:
        start_tag = '<span class="nom">'

    if end_tag is None:
        end_tag = '</span>'

    for kw in kwlist:
        st = re.sub(ur'\b' + kw.decode('utf8') + ur'\b', 
           u'{}{}{}'.format(start_tag.decode('utf8'), kw.decode('utf8'), end_tag.decode('utf8')),
           st.decode('utf8'), 0, re.U).encode("utf8")
    return st

st="Korais Ο Αδαμάντιος Κοραής (Σμύρνη, 27 Απριλίου 1748 – Παρίσι, 6 Απριλίου 1833), ήταν Έλληνας φιλόλογος με βαθιά γνώση του ελληνικού πολιτισμού. Ο Κοραής είναι ένας από τους σημαντικότερους εκπροσώπους του νεοελληνικού διαφωτισμού και μνημονεύεται, ανάμεσα σε άλλα, ως πρωτοπόρος στην έκδοση έργων αρχαίας ελληνικής γραμματείας, αλλά και για τις γλωσσικές του απόψεις στην υποστήριξη της καθαρεύουσας, σε μια μετριοπαθή όμως μορφή της με σκοπό την εκκαθάριση των πλείστων ξένων λέξεων που υπήρχαν στη γλώσσα του λαού."
kwlist = ['ελληνικού', 'Σμύρνη', 'Αδαμάντιος', 'Korais']
d = highlight_text(st, kwlist, start_tag=None, end_tag=None)
print(d)

请参阅demo

请注意,所有文字均使用u前缀声明,所有变量均为decodere.sub结果为encode d返回UTF8。

答案 1 :(得分:0)

  

英语被标记。希腊的substr被忽略了。

st来自哪里?请注意,在Python 2.x 'μορφή' != u'μορφή'中,您可能正在将strunicode进行比较。

建议:尽可能在任何地方使用unicode,例如:

kwlist = [u'ελληνικού', u'Σμύρνη', u'Αδαμάντιος', u'Korais']