【问题标题】:Positive lookbehind on non-ASCII characters in RR中非ASCII字符的正向回顾
【发布时间】:2017-12-02 06:10:28
【问题描述】:

我有一个 R 函数,它试图将每个“单词”的第一个字母大写

proper = function(x){
  gsub("(?<=\\b)([[:alpha:]])", "\\U\\1", x, perl = TRUE)
}

这很好用,但是当我有一个带有毛利长音符号的单词时,比如Māori,我得到了不正确的大写,例如

> proper("Māori")
[1] "MāOri"

很明显,RE 引擎认为宏 ā 是一个字边界。不知道为什么。

【问题讨论】:

  • this 是否发布帮助?来自stringrstr_to_title 也不大写毛利语中的o。
  • 是否有 unicode 标志(如 regex101.com/r/unVXlI/1 中使用的标志)?顺便说一句,对于诸如单词边界之类的东西,可能没有必要使用lookbehind。

标签: r regex


【解决方案1】:

由于您使用的是 PCRE 正则表达式引擎(通过 perl=TRUE 启用),因此您必须将 (*UCP) 标志传递给正则表达式,以便所有速记和单词边界都可以检测到 Unicode 文本中的正确符号/位置:

proper = function(x){
  gsub("(*UCP)\\b([[:alpha:]])", "\\U\\1", x, perl = TRUE)
}
proper("Māori")
## [1] "Māori"

请参阅R demo

请注意,\b 已经是一个零宽度断言,并且不必放在正向的后视中,即(?&lt;=\b) = \b

【讨论】:

  • 另外,"(*UCP)\\b([[:alpha:]])" 可以替换为更短的"(*UCP)\\b(\\p{L})"
  • 优秀。谢谢!
【解决方案2】:

\b 基本上表示除[a-zA-Z0-9_] 之外的字符的边界,其中还包括多字节字符,除非设置了名为Unicode 的修饰符来影响引擎行为。

不幸的是,R 中的gsub 没有这个标志,或者我在文档中找不到任何关于它的信息。

解决方法是:

(?<!\\S)([[:alpha:]])

另一方面,这显然在 āmori 上失败了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-12
    • 2013-02-19
    • 1970-01-01
    • 2012-01-23
    • 2010-10-18
    • 2012-12-31
    • 2013-06-19
    • 2012-06-13
    相关资源
    最近更新 更多