簡體   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