Python re.compile卷曲引号问题

时间:2016-06-24 13:47:50

标签: python regex

我目前正在编写一个使用框架来匹配某些短语的应用程序,目前它应该匹配以下正则表达式模式:

Say "Hello world!" <-- Matches
Say “Hello world!” <-- Doesn't match!

但是,我注意到我的用户抱怨他们的操作系统有时会复制并粘贴“引号”&#39;在最终发生的事情是用户提供以下句子:

u'Say (?:["“”])(.*)(?:["“”])'

# (?:["“”])    <-- Start non-capturing group, and match one of the three possible quote typesnot return it
# (.*)         <-- Start a capture group, match anything and return it
# (?:["“”])    <-- Stop matching the string until another quote is found

有什么方法可以告诉Python的正则表达式将这些引号与常规引号相同?

编辑:

事实证明,您可以非常轻松地告诉Python使用unicode字符串读取您的正则表达式,我将我的代码更改为以下内容并且它有效:

if(textField.keyboardType == UIKeyboardTypeNumbersAndPunctuation)
    {
        NSString *validRegEx =@"^[0-9.]*$"; //change this regular expression as your requirement
        NSPredicate *regExPredicate =[NSPredicate predicateWithFormat:@"SELF MATCHES %@", validRegEx];
        BOOL myStringMatchesRegEx = [regExPredicate evaluateWithObject:string];
        if (myStringMatchesRegEx)
            return YES;
        else
            return NO;
    }

2 个答案:

答案 0 :(得分:4)

你可以在正则表达式中包含引号:

Say [\"“”](.*)[\"“”]

作为可以在Python repl中复制的东西,它是这样的:

>>> import re
>>> test_str = r'"Hello"'
>>> reg = r'["“”](.*)["“”]'
>>> m = re.search(reg, test_str)
>>> m.group(1)
'Hello'
>>> test_str = r'“Hello world!”'
>>> m = re.search(reg, test_str)
>>> m.group(1)
'\x80\x9cHello world!\xe2\x80'

答案 1 :(得分:1)

作为Kyle答案的替代方案,您可以通过替换引号来为当前正则表达式准备字符串: string.replace('“', '"').replace('”', '"')