Python 2 re.sub 问题 [英] Python 2 re.sub issue

查看:58
本文介绍了Python 2 re.sub 问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I got this a function that replaces sub-string matches with the match surrounded with HTML tags. This function will consume string in English and Greek mostly.

功能:

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 应用程序中运行上述函数时,它会抛出一个错误:正则表达式意外结束.

When I'm running the code [st is the above string] only sub-strings in English get tagged. Greek substr are ignored. Notice that I run the above block on Python 2.7. When I use Python 3.4 all sub-string get replaced. Another issue is that when I'm running the above function withing Flask application, it throws me an error: unexpected end of regular expression.

如果可能,我应该如何在不使用外部库的情况下解决上述问题?两天了,我要把头发从头上拔下来.

How should I tackle the above issue without using external library if possible? I'm pulling my hairs off my head two days now.

推荐答案

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

In Python 2.7, you need to explicitly convert text to Unicode. See the fixed snippet below:

# -*- 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 前缀声明,所有变量都经过 decodeed 并且 re.sub 结果是 encoded 回到 UTF8.

Note that all literals are declared with u prefix and all variables are decodeed and the re.sub result is encoded back to UTF8.

这篇关于Python 2 re.sub 问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆