R

您所在的位置:网站首页 r语言grepl函数用法 R

R

2024-05-09 08:21| 来源: 网络整理| 查看: 265

grep 模式匹配和替换 Description

grep 、 grepl 、 regexpr 、 gregexpr 、 regexec 和 gregexec 在字符向量的每个元素内搜索与参数 pattern 的匹配项:它们在结果的格式和详细信息量方面有所不同。

sub 和 gsub 分别执行首个和所有匹配项的替换。

Usage grep(pattern, x, ignore.case = FALSE, perl = FALSE, value = FALSE, fixed = FALSE, useBytes = FALSE, invert = FALSE) grepl(pattern, x, ignore.case = FALSE, perl = FALSE, fixed = FALSE, useBytes = FALSE) sub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE, fixed = FALSE, useBytes = FALSE) gsub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE, fixed = FALSE, useBytes = FALSE) regexpr(pattern, text, ignore.case = FALSE, perl = FALSE, fixed = FALSE, useBytes = FALSE) gregexpr(pattern, text, ignore.case = FALSE, perl = FALSE, fixed = FALSE, useBytes = FALSE) regexec(pattern, text, ignore.case = FALSE, perl = FALSE, fixed = FALSE, useBytes = FALSE) gregexec(pattern, text, ignore.case = FALSE, perl = FALSE, fixed = FALSE, useBytes = FALSE) Arguments pattern

包含要在给定字符向量中匹配的 regular expression (或 fixed = TRUE 的字符串)的字符串。如果可能,由 as.character 强制转换为字符串。如果提供长度为 2 或以上的字符向量,则使用第一个元素时会发出警告。除 regexpr 、 gregexpr 和 regexec 外,允许缺失值。

x, text

寻找匹配的字符向量,或者可以由 as.character 强制转换为字符向量的对象。支持 Long vectors 。

ignore.case

如果 FALSE ,则模式匹配区分大小写;如果 TRUE ,则在匹配过程中忽略大小写。

perl

合乎逻辑的。应该使用 Perl 兼容的正则表达式吗?

value

如果是 FALSE ,则返回包含由 grep 确定的匹配的 ( integer ) 索引的向量,如果是 TRUE ,则返回包含匹配元素本身的向量。

fixed

合乎逻辑的。如果 TRUE 、 pattern 是要按原样匹配的字符串。覆盖所有冲突的参数。

useBytes

合乎逻辑的。如果是 TRUE ,则匹配是逐字节而不是逐字符进行的。查看具体信息'。

invert

合乎逻辑的。如果 TRUE 返回不匹配元素的索引或值。

replacement

sub 和 gsub 中匹配模式的替代品。如果可能的话,强制性格。对于 fixed = FALSE ,这可以包括 "\1" 到 "\9" 对 pattern 带括号的子表达式的反向引用。仅适用于 perl = TRUE ,它还可以包含 "\U" 或 "\L" ,以将其余替换转换为大写或小写,以及 "\E" 转换为最终大小写。如果提供长度为 2 或以上的字符向量,则使用第一个元素时会发出警告。如果是 NA ,则匹配结果对应的所有元素都将被设置为 NA 。

Details

如果可能的话,应该是字符串或字符向量的参数将被强制转换为字符。

这些功能中的每一个都以三种模式之一运行:

fixed = TRUE :使用精确匹配。

perl = TRUE :使用 Perl 风格的正则表达式。

fixed = FALSE, perl = FALSE :使用 POSIX 1003.2 扩展正则表达式(默认)。

有关不同类型正则表达式的详细信息,请参阅 regular expression 的帮助页面。

两个 *sub 函数的区别仅在于 sub 仅替换第一次出现的 pattern ,而 gsub 替换所有出现的 pattern 。如果 replacement 包含 pattern 中未定义的反向引用,则结果未定义(但大多数情况下反向引用被视为 "" )。

对于 regexpr 、 gregexpr 、 regexec 和 gregexec , pattern 为 NA 是错误的,否则允许 NA 并给出 NA 匹配。

grep 和 grepl 都将 x 中的缺失值视为与非缺失 pattern 不匹配。

useBytes = TRUE 的主要作用是避免有关多字节语言环境中的无效输入和虚假匹配的错误/警告,但对于 regexpr ,它改变了输出的解释。它禁止带有标记编码的输入的转换,并且如果发现任何标记为 "bytes" 的输入(请参阅 Encoding ),则强制转换。

无大小写匹配对于多字节语言环境中的字节没有多大意义,并且您应该期望它仅适用于 useBytes = TRUE 的 ASCII 字符。

regexpr 和 gregexpr 以及 perl = TRUE 允许 Python 风格的命名捕获,但不适用于长向量输入。

当前语言环境中的无效输入将被警告最多 5 次。

非 ASCII 字符与 perl = TRUE 的无大小写匹配取决于使用“Unicode 属性支持”编译的 PCRE library ,默认情况下 PCRE2 是该支持。

Value

grep(value = FALSE) 返回产生匹配(或不匹配,对于 invert = TRUE )的 x 元素索引的向量。这将是一个整数向量,除非输入是 long vector ,否则它将是一个双向量。

grep(value = TRUE) 返回包含 x 所选元素的字符向量(强制后,保留名称但不保留其他属性)。

grepl 返回一个逻辑向量( x 的每个元素是否匹配)。

sub 和 gsub 返回与 x 具有相同长度和相同属性的字符向量(在可能强制转换为字符之后)。未替换的字符向量 x 的元素将按原样返回(包括任何声明的编码)。如果 useBytes = FALSE ,非 ASCII 替换结果通常采用带标记编码的 UTF-8 格式(例如,如果有 UTF-8 输入,并且采用多字节语言环境,除非 fixed = TRUE )。此类字符串可以由 enc2native 重新编码。

regexpr 返回与 text 长度相同的整数向量,给出第一个匹配的起始位置或-1如果没有,则属性 "match.length" 是一个整数向量,给出匹配文本的长度(或-1没有匹配)。匹配位置和长度以字符为单位,除非使用 useBytes = TRUE ,否则它们以字节为单位(因为它们仅用于 ASCII 匹配:在任何一种情况下,都会在结果上设置值为 TRUE 的属性 useBytes )。如果使用命名捕获,则还有其他属性 "capture.start" 、 "capture.length" 和 "capture.names" 。

gregexpr 返回与 text 长度相同的列表,其中每个元素的形式与 regexpr 的返回值相同,只是给出了每个(不相交)匹配的起始位置。

regexec 返回与 text 长度相同的列表,其中每个元素是-1如果没有匹配项,或者是一个整数序列,其中包含匹配项的起始位置以及与 pattern 带括号的子表达式相对应的所有子字符串,其中属性 "match.length" 是一个给出匹配项长度的向量(或-1没有匹配)。位置和长度以及属性的解释遵循 regexpr 。

gregexec 返回与 regexec 相同的结果,除了为了容纳 text 的每个元素的多个匹配项,每个匹配项的整数序列被制成矩阵的列, text 的每个元素有一个匹配的矩阵。

如果由于资源限制(特别是 perl = TRUE )导致匹配失败,则视为不匹配,通常会出现警告。

Warning

gsub 和 gregexpr 的 POSIX 1003.2 模式对于重复的字边界(例如, pattern = "\b" )无法正常工作。使用 perl = TRUE 进行此类匹配(但对于非 ASCII 输入,这可能无法按预期工作,因为“单词”的含义取决于系统)。

Performance considerations

如果您正在进行大量正则表达式匹配,包括非常长的字符串,您将需要考虑使用的选项。一般来说, perl = TRUE 会比默认的正则表达式引擎更快,而 fixed = TRUE 更快(特别是当每个模式仅匹配几次时)。

如果您在单字节语言环境中工作,并标记了可在该语言环境中表示的 UTF-8 字符串,请首先将它们转换,因为只有一个 UTF-8 字符串将强制所有匹配都以 Unicode 完成,这会带来以下损失:大约3x对于默认的 POSIX 1003.2 模式。

如果可以使用 useBytes = TRUE ,匹配前就不会检查字符串,实际匹配会更快。通常,在 UTF-8 语言环境中基于字节的匹配就足够了,因为一个字符的字节模式永远不会匹配另一个字符的部分。字符范围可能会产生意外的结果。

当 x / text 的长度为 10 或更长时,PC R 基于 E 的匹配默认用于投入额外的精力来“研究”已编译的模式。该研究可能会在可用的平台上使用 PC R E JIT 编译器(请参阅 pcre_config )。从 PC R E2( extSoftVersion 报告的 PC R E 版本 >= 10.00)开始,没有学习阶段,但模式会在可能的情况下自动优化,并且在启用时使用 PC R E JIT。细节由 options 、 PCRE_study 和 PCRE_use_JIT 控制。(可以通过在 R 源(可能已安装)中运行文件“tests/PC R E. R ”来查看一些时序比较。)使用 PC R E 和很长字符串的人员可以通过以下方式调整 JIT 堆栈的最大大小:在使用 JIT 之前将环境变量 R _PC R E_JIT_STACK_MAXSIZE 设置为 1 和 1000 之间的值(以 MB 为单位):默认值为 64 。当 JIT 不与 PC R E 版本 < 10.30 一起使用时(即与 PC R E1 和旧版本的 PC R E2 一起使用),设置选项 PCRE_limit_recursion 也可能是明智的。

Note

方面将依赖于平台和本地:例如字符类的实现(除了 [:digit:] 和 [:xdigit:] )。人们可以预期 ASCII 输入和在 UTF-8 模式下工作时的结果是一致的(大多数平台将使用 Unicode 字符表,尽管这些字符表经常更新并且受到某种程度的解释 - 是带圆圈的大写字母还是符号) ?)。然而,8 位编码的结果在不同平台、模式以及 UTF-8 版本之间可能有很大差异。

Source

POSIX 风格正则表达式匹配的 C 代码多年来已经发生了变化。从 R 2.10.0(2009 年 10 月)开始,使用 Ville Laurikari ( https://github.com/laurikari/tre ) 的 T R E library 。POSIX 标准确实提供了一些解释空间,特别是在处理无效正则表达式和字符范围排序规则方面,因此多年来结果会略有变化。

对于 Perl 风格的匹配,使用 PCRE2 或 PCRE ( https://www.pcre.org ):同样,结果可能(稍微)取决于所使用的 PCRE 版本。

References

Becker, RA、Chambers, JM 和 Wilks, AR (1988) 新 S 语言。沃兹沃斯和布鲁克斯/科尔 ( grep )

See Also

regular expression (又名 regexp )了解图案规格的详细信息。

regmatches 用于根据 regexpr 、 gregexpr 和 regexec 的结果提取匹配的子字符串。

glob2rx 将通配符匹配转换为正则表达式。

agrep 用于近似匹配。

charmatch 、 pmatch 用于部分匹配, match 用于匹配整个字符串, startsWith 用于匹配字符串的初始部分。

tolower 、 toupper 和 chartr 用于字符翻译。

apropos 使用正则表达式并有更多示例。

grepRaw 用于匹配原始向量。

选项 PCRE_limit_recursion 、 PCRE_study 和 PCRE_use_JIT 。

extSoftVersion 表示正在使用的正则表达式和 PCRE libraries 的版本, pcre_config 表示 PCRE 的更多详细信息。

Examples grep("[a-z]", letters) txt


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3