我得到了一个函数,用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应用程序运行上述函数时,它会抛出一个错误:正则表达式意外结束。
如果可能的话,如何在不使用外部库的情况下解决上述问题? 两天后我把头发拉了下来。
答案 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
前缀声明,所有变量均为decode
,re.sub
结果为encode
d返回UTF8。
答案 1 :(得分:0)
英语被标记。希腊的substr被忽略了。
st
来自哪里?请注意,在Python 2.x 'μορφή' != u'μορφή'
中,您可能正在将str
与unicode
进行比较。
建议:尽可能在任何地方使用unicode
,例如:
kwlist = [u'ελληνικού', u'Σμύρνη', u'Αδαμάντιος', u'Korais']