只接受带有重音字符的正则表达式

4

我需要一个正则表达式,只接受带有重音符号的字符。目前我正在使用以下表达式:

[ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöœøùúûüýþÿ]*$

有没有其他比我表达更清晰的说法?


1
那个看起来相当不错。 - Robert Harvey
可能的解决方案是使用代码表示这些字符... - ROMANIA_engineer
1
你应该在开头包含 ^ 锚点(这样就不只匹配字符串的结尾),并且使用 + 而不是 *,除非你想匹配空字符串。 - Mr. Llama
如果你想匹配更大的字符串中的带重音符号的字符,可以删除 $ 锚点。但一定要将 * 更改为 + - Alan Moore
4个回答

1
正则表达式并不总是处理文本的最清晰方式,即使它是最快的。您可以将正则表达式分配给一个变量,然后通过文本插值进行插入:
accent_chars = '[ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöœøùúûüýþÿ]'

my_regex = '^...%s*...$' % accent_chars

你也可以使用这些范围:

[œÀ-ÖØ-öø-ÿ]

使用Python 3进行演示:

>>> import re
>>> s = 'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöœøùúûüýþÿ'
>>> ''.join(re.findall('[œÀ-ÖØ-öø-ÿ]', s))
'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöœøùúûüýþÿ'
>>> len(''.join(re.findall('[œÀ-ÖØ-öø-ÿ]', s))) == len(s)
True

这样做的缺点是,对于不熟悉Unicode的人来说,并不立即清楚它涵盖了所有所需情况。

1
自从所有字符都在192个字符À和255个字符ÿ之间,除了œ,你能否像向前查找并检查它们不包含你不想要的范围内的任何字符一样做些什么?我不确定相比于你的方法是否有所改善,但它更短,也许,只是也许,更清晰。
(?![÷×])[À-ÿœ]

1
我觉得正则表达式需要在注释中包含您的段落解释,以便将来能够维护它。 - Mr. Llama
1
前瞻应该是 (?![÷×]) 吗?或者加上 [œÀ-ÖØ-öø-ÿ] 也不错的想法 :) - Jonny 5
哦,是的,我在手机上写了这个(还有这个),谢谢! - Juan Cortés
我认为这很难维护。维护者必须查阅Unicode表以检查范围匹配的内容。OP的解决方案有点长,但更容易看出字符类别匹配的内容。 - nhahtdh
公平地说,这就是为什么我指出它更短,也许更清晰的原因。对我来说,现在很清楚,因为我一直在字符表的这个区域工作,并且会识别这个表达式,但两个月后读起来可能不太清楚,除非有注释。但再说一遍,我喜欢注释我的代码,所以不应该有任何问题。 - Juan Cortés

1

我认为这会解决你的问题:

[œÀ-ÖØ-öø-ÿ]*$

0

1
一些正则表达式实现支持字符类减法,这意味着以下内容可能会根据操作者的具体情况而起作用:[[:alpha:]-[a-zA-Z]] - Mr. Llama
在Unicode模式下,这可能匹配更多内容,而在ASCII模式下则不匹配OP需要的任何字符。并且根据语言/库/模式的不同,正则表达式可能会基于区域设置匹配字符,其行为可能完全不同。如果您想从中匹配特定字符子集,则使用POSIX字符类不是一个好主意。 - nhahtdh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接