繁体   English   中英

Python 2 re.sub问题

[英]Python 2 re.sub issue

我得到了一个函数,该函数用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应用程序中运行上述函数时,会引发错误:正则表达式意外结束。

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

在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)

观看演示

请注意,所有文字均以u前缀声明,并且所有变量均被decode ,并且re.sub结果被encode回utf8。

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

你的st从哪里来? 请注意,在Python 'μορφή' != u'μορφή'也许您正在比较strunicode

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM