在Python unicoded字符串中查找并替换两种引用样式

时间:2015-11-18 14:22:32

标签: python regex if-statement

我试图用Python中的字符串替换引号样式(“...”和" ...")中标记的字符串。

我已经写了一个正则表达式来替换标准语录

print re.sub(r'\"(.+?)\"', r'<em>"\1"</em>', self.title)

当我尝试为文学(?)创作时,它不会取代任何东西。

return re.sub(r'\“(.+?)\”', r'<em>“\1”</em>', self.title)

事实上,正如我现在所做的那样,我甚至无法进行条件查询:

quote_list = ['“', '”']

if all(character in self.title for character in quote_list):
    print "It has literary quotes"
    print re.sub(r'\“(.+?)\”', r'<em>“\1”</em>', self.title)
print re.sub(r'\"(.+?)\"', r'<em>"\1"</em>', self.title)

编辑:更多背景信息:它是一个对象

class Entry(models.Model):
    title = models.CharField(max_length=200)

def render_title(self):
    """
    This function wraps italics around quotation marks
    """
    quote_list = ['“', '”']

    if all(character in self.title for character in quote_list):
        print "It has literary quotes"
        return re.sub(r'\“(.+?)\”', r'<em>“\1”</em>', self.title)
    return re.sub(r'\"(.+?)\"', r'<em>"\1"</em>', self.title)

我不熟悉正则表达式命令。我做错了什么?

EDIT2 :更接近问题!这是因为我处理的是非编码字符串。我仍然难以理解如何解决这个问题。任何帮助表示赞赏!

>>> title = u"sdsfgsdfgsdgfsdgs “ asd” asd"
>>> print re.sub(r'\“(.+?)\”', r'<em>“\1”</em>', title)
sdsfgsdfgsdgfsdgs “ asd” asd
>>> title = "sdsfgsdfgsdgfsdgs “ asd” asd"
>>> print re.sub(r'\“(.+?)\”', r'<em>“\1”</em>', title)
sdsfgsdfgsdgfsdgs <em>“ asd”</em> asd

2 个答案:

答案 0 :(得分:0)

#!/usr/bin/python
# -*- coding: utf-8 -*-
import re
quote_list = ['“', '”']
title = "“...”"

if all(character in title for character in quote_list):
    print "It has literary quotes"
    print re.sub(r'\“(.+?)\”', r'<em>“\1”</em>', title)
  1. 请检查您的编码是否支持您正在使用的字符。我在这里使用utf-8,它支持你使用的引用,一切都运行良好。
  2. 你的if条件可能根本不是真的,检查条件是否都是真的。当每个元素都是all
  3. 时,Truthy会返回true

    确保比较或使用regexpression时的编码格式相同。支持对unicode字符串使用unicode regexp模式

    quote_list = [u'“', u'”']
    title = u"“...”"
    
    if all(character in title for character in quote_list):
       print "It has literary quotes"
       print re.sub(u'\“(.+?)\”', u'<em>“\1”</em>', title)
    

答案 1 :(得分:0)

我终于找到了答案。按照@interjay的建议打印变量后,我发现该字符串是单行编码的。

将它与一个简单的字符串进行比较不起作用所以我删除了条件并使用这个answer来简单地创建一个unicode-escaped正则表达式字符串来处理简单和“文学”引号。

title = re.sub(ur'\“(.+?)\”', ur'“<em>\1</em>”', self.title)  # notice the ur
title = re.sub(ur'\"(.+?)\"', ur'"<em>\1</em>"', title)

我在评论中看到(不幸的是现在已删除)如何将上述两个句子合并为一个,但现在它可以工作。

非常感谢你的帮助!