当前位置: 首页 > 面试题库 >

python-re:如何匹配字母字符

越文康
2023-03-14
问题内容

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


问题答案:

您的前两个句子相互矛盾。“在\w但不在\d”中包括下划线。我假设从您的第三句话开始,您不想下划线。

使用信封背面的维恩图会有所帮助。让我们看看我们不想要的:

(1)不匹配的字符\w(即,不需要字母,数字或下划线的任何内容)=> \W
(2)数字=> \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(杭州数字ONE)被视为数字(因此与\ w匹配),但是Python似乎将“数字”解释为“十进制数字”(类别Nd),因此与\ d不匹配

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

所有CJK表意文字均归类为“字母”,因此与\ w

无论上述3点中的任何一个是否值得关注,该方法都是您最好脱离当前发布的re模块的最佳方法。将来会使用\ p {letter}之类的语法。



 类似资料:
  • 问题内容: 我有一个要从中提取3组的字符串: 月名称可能包含非ASCII字符,因此对我不起作用: 我可以使用,但它匹配数字和下划线: 我尝试使用[:alpha:],但是不起作用: 如果我能以某种方式匹配而没有,但我不知道如何。即使我知道如何做到这一点,是否也有像Python中那样可用的现成快捷方式? 问题答案: 您可以构造一个新的角色类: 代替。翻译成英文,意思是“任何不是非字母数字字符(与相同)

  • 问题内容: 我正在验证用户输入的文本,以便它仅接受字母,而不接受数字。到目前为止,当我输入数字(例如56)时,我的代码可以正常工作,它警告我只能输入字母,而当我输入字母时,它不会返回任何内容(就像它应该那样)。我的问题是,当我开始输入字母后跟数字时,它会接受它,例如(s45)。它的作用是接受第一个字母,但不接受整个字符串。我需要它来接受整个字符串。 问题答案: 将其固定到开头和结尾,并匹配 一个或

  • 问题内容: 在.net中,您可以使用它来匹配任何字母,如何在Python中进行匹配?即,我想匹配任何大写,小写和带重音的字母。 问题答案: Python的模块尚不支持Unicode属性。但是您可以使用该标志编译正则表达式,然后字符类速记也将与Unicode字母匹配。 由于还将匹配数字,因此您需要从字符类中减去数字以及下划线: 将匹配任何Unicode字母。

  • 问题内容: 我有以下仅允许字母的正则表达式: 如何使用p {L}(通用-任何语言,例如德语,英语等)来执行此操作 我试过了 但所有字母a =“ aB”均返回null 问题答案: 从ECMAScript2018开始,JavaScript终于原生支持Unicode属性转义。 对于较旧的版本,您要么需要自己定义所有相关的Unicode范围。或者,您可以将StevenLevithan的程序包与Unicod

  • 问题内容: 我正在尝试为PHP中的名称编写一个合理的验证器,而我的第一次尝试包括以下模式: 最终将其传递给的呼叫。据我所知,这可以与您的原始ASCII字母一起使用,但似乎在诸如Ă或张之类的易变字符上起作用。 模式本身有问题吗?也许我期望做的工作比我想象的还要多? 还是与输入的传递方式有关?我不确定是否相关,但是我确实确保在表单页面上指定UTF8编码。 问题答案: 我认为问题要比这简单得多:您忘记了

  • 我试图找出我的字符串是否包含从a到z的所有字母 我们可以通过其他方法解决这个问题,但我正在尝试仅使用模式和匹配器来解决它。