python-re:我如何匹配alpha字符

时间:2010-01-10 23:43:20

标签: python regex unicode regex-negation

如何将alpha字符与正则表达式匹配。我想要一个\w但不在\d的角色。我希望它与unicode兼容,这就是为什么我不能使用[a-zA-Z]

3 个答案:

答案 0 :(得分:47)

你的前两句话相互矛盾。 “在\w但不在\d中”包含下划线。我从你的第三句话中假设你不想要下划线。

在信封背面使用维恩图有助于。让我们来看看我们不想要的东西:

(1)与\w不匹配的字符(即不想要任何不是字母,数字或下划线的字符)=> \W
(2)digits => \d
(3)下划线=> _

所以我们不想要的是字符类[\W\d_]中的任何内容,因此我们想要的是字符类中的任何内容[^\W\d_]

这是一个简单的例子(Python 2.6)。

>>> import re
>>> rx = re.compile("[^\W\d_]+", re.UNICODE)
>>> rx.findall(u"abc_def,k9")
[u'abc', u'def', u'k']

进一步探索揭示了这种方法的一些怪癖:

>>> import unicodedata as ucd
>>> allsorts =u"\u0473\u0660\u06c9\u24e8\u4e0a\u3020\u3021"
>>> for x in allsorts:
...     print repr(x), ucd.category(x), ucd.name(x)
...
u'\u0473' Ll CYRILLIC SMALL LETTER FITA
u'\u0660' Nd ARABIC-INDIC DIGIT ZERO
u'\u06c9' Lo ARABIC LETTER KIRGHIZ YU
u'\u24e8' So CIRCLED LATIN SMALL LETTER Y
u'\u4e0a' Lo CJK UNIFIED IDEOGRAPH-4E0A
u'\u3020' So POSTAL MARK FACE
u'\u3021' Nl HANGZHOU NUMERAL ONE
>>> rx.findall(allsorts)
[u'\u0473', u'\u06c9', u'\u4e0a', u'\u3021']

U + 3021(HANGZHOU NUMERAL ONE)被视为数字(因此它匹配\ w)但似乎Python将“数字”解释为“十进制数字”(类别Nd),因此它不匹配\ d < / p>

U + 2438(圆形拉丁文小写字母Y)不匹配\ w

所有CJK表意文字都被归类为“字母”,因此匹配\ w

无论上述3点中的任何一点是否值得关注,这种方法都是目前发布的最佳模块。像\ p {letter}这样的语法将来会出现。

答案 1 :(得分:2)

怎么样:

\p{L}

您可以将此文档用作参考:Unicode Regular Expressions

编辑:似乎Python doesn't handle Unicode expressions。请查看以下链接:Handling Accented Characters with Python Regular Expressions -- [A-Z] just isn't good enough(不再有效,链接到互联网档案)

另一个参考文献:


对于后代,以下是博客上的示例:

import re
string = 'riché'
print string
riché

richre = re.compile('([A-z]+)')
match = richre.match(string)
print match.groups()
('rich',)

richre = re.compile('(\w+)',re.LOCALE)
match = richre.match(string)
print match.groups()
('rich',)

richre = re.compile('([é\w]+)')
match = richre.match(string)
print match.groups()
('rich\xe9',)

richre = re.compile('([\xe9\w]+)')
match = richre.match(string)
print match.groups()
('rich\xe9',)

richre = re.compile('([\xe9-\xf8\w]+)')
match = richre.match(string)
print match.groups()
('rich\xe9',)

string = 'richéñ'
match = richre.match(string)
print match.groups()
('rich\xe9\xf1',)

richre = re.compile('([\u00E9-\u00F8\w]+)')
print match.groups()
('rich\xe9\xf1',)

matched = match.group(1)
print matched
richéñ

答案 2 :(得分:0)

您可以使用以下表达式之一来匹配单个字母:

import UIKit

    class MainTableViewController: UITableViewController, UITextFieldDelegate {

    @IBOutlet weak var name: UITextField!
    @IBOutlet weak var phone: UITextField!  
    @IBOutlet weak var email: UITextField!

    @IBAction func btnSave() {

            if name.text == " " {
                let alert = UIAlertController(title: "Data", message: "Missing Name.", preferredStyle: UIAlertControllerStyle.Alert)
                alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
                self.presentViewController(alert, animated: true, completion: nil)
            }

            else if phone.text == " " {
                    let alert = UIAlertController(title: "Data", message: "Missing Phone Number.", preferredStyle: UIAlertControllerStyle.Alert)
                    alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
                    self.presentViewController(alert, animated: true, completion: nil)
                    return
            }

            else if email.text == " " {
                let alert = UIAlertController(title: "Data", message: "Missing Email Address.", preferredStyle: UIAlertControllerStyle.Alert)
                alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
                self.presentViewController(alert, animated: true, completion: nil)
                return
            }

            let userDefaults = NSUserDefaults.standardUserDefaults()

            userDefaults.setObject(name, forKey:"name")
            userDefaults.setObject(phone, forKey:"phone")
            userDefaults.setObject(email, forKey:"email")

            userDefaults.synchronize()
        }

        override func viewDidLoad() {

            let userDefaults = NSUserDefaults.standardUserDefaults()

            userDefaults.setObject(" ", forKey: "name")
            userDefaults.setObject(" ", forKey: "phone")
            userDefaults.setObject(" ", forKey: "email")

            super.viewDidLoad()

        }   
    }

(?![\d_])\w

此处我匹配\w(?<![\d_]) ,但检查\w之前/之后是否匹配。

来自文档:

[\d_]