当前位置: 首页 > 知识库问答 >
问题:

抓取n个字母单词不计撇号正则表达式

冯鸿哲
2023-03-14

我正试图更深入地学习R中的正则表达式。我给自己做了一件我认为很容易的事,我想不出来。我想提取所有4个字母的单词。在这四个字母的单词中,我想忽略(不算)撇号。我可以在没有正则表达式的情况下完成这项工作,但需要正则表达式解决方案。这是一个MWE和我尝试过的:

text.var <- "This Jon's dogs' 'bout there in Mike's re'y word."
pattern <- "\\b[A-Za-z]{4}\\b(?!')"
pattern <- "\\b[A-Za-z]{4}\\b|\\b[A-Za-z']{5}\\b"

regmatches(text.var, gregexpr(pattern, text.var, perl = TRUE)) 

**期望输出:**

[[1]]
[1] "This"  "Jon's"  "dogs'"  "'bout"  "word"

我以为第二种模式会工作,但它也抓取包含5个字符的单词。

共有3个答案

昝枫
2023-03-14

您可以使用discard技术并使用如下正则表达式:

\b\w{0,2}\b(?:'\w)?|\b\w{3}(?!')\b|\b\w{5,}\b|('?\b\w+\b'?\w?)

工作演示

MATCH 1
1.  [0-4]   `This`
MATCH 2
1.  [5-10]  `Jon's`
MATCH 3
1.  [11-16] `dogs'`
MATCH 4
1.  [17-22] `'bout`
MATCH 5
1.  [32-36] `word`

对于R,需要对特殊字符进行转义。

正如您在regex模式中所看到的,您可以在模式的左侧使用您不想要的任何东西,并在最右侧的捕获组中留下您真正想要的东西。丢弃技术背后的理念是:

discard this|don't want this|still don't care this|(Oh yeah! I grab this)

感谢EdConttrell和johnwait帮助我改进答案。

冀耀
2023-03-14

您可以使用此模式:

(?i)(?<![a-z'])(?:'?[a-z]){4}'?(?![a-z'])
储国发
2023-03-14

这是一个很有挑战性的问题,这里有一个棘手的答案。

> x  <- "This Jon's dogs' 'bout there in Mike's re'y word."
> re <- "(?i)('?[a-z]){5,}(*SKIP)(?!)|('?[a-z]){4}'?"
> regmatches(x, gregexpr(re, x, perl=T))[[1]]
## [1] "This"  "Jon's" "dogs'" "'bout" "word" 

说明:

其想法是跳过由5个或更多字母字符和可选撇号组成的任何单词模式。

在alternation操作符的左侧,我们匹配不需要的子模式。使其失败,并使用回溯控制强制正则表达式引擎不重试子字符串。如下所述:

(*SKIP) # advances to the position in the string where (*SKIP) was 
        # encountered signifying that what was matched leading up 
        # to cannot be part of the match

(?!)    # equivalent to (*FAIL), causes matching failure, 
        # forcing backtracking to occur

alternation运算符的右侧与我们想要的匹配。。。

>

  • 本质上,简单地说,您使用的是丢弃技术。

    (?:'?[a-z]){5,}|((?:'?[a-z]){4}'?)
    

    您在上下文中使用交替运算符,将您想要排除的内容放在左侧(说扔掉这个,这是垃圾),并将您想要匹配的内容放在右侧的捕获组中。

  •  类似资料:
    • 出于某种原因,上面的正则表达式没有捕捉带撇号的名称。 例如:D'STALL先生不匹配。任何关于regex模式的帮助都将不胜感激。 代码所做的是获取输入并用XML标记它。诸如以下内容: 正则表达式与上述段落不匹配。

    • 我正在尝试构建一个正则表达式来验证用户名,该用户名将包含字母数字字符,并且应该允许<代码>(dot)(撇号)和-(破折号),我尝试了以下正则表达式,但它们不起作用 <代码>/^[a-zA-Z0-9\.-]$/<代码> 请帮帮忙

    • 尝试使用正则表达式识别文本数据的结构并遇到障碍。 对于下面的示例文本 Lorem Ipsum只是印刷和排版行业的虚拟文本。自16世纪以来,Lorem Ipsum一直是业界的标准虚拟文本。 我是一个标签-Lorem Ipsum只是打印的虚拟文本 下面的正则表达式选择I AM A HEADER:和I AM A TAB- 请建议进行编辑,以匹配“我是标题”和“我是标签”,并忽略结尾标记“:”和“-”。

    • 我想写一个正则表达式(C#),可以匹配没有引号的单词。输入字符串示例如下: dbo.testline_length"引用的话"不引用 这个需要匹配 dbo.test line_length 无报价 因此,3个单独的匹配和“引用的单词”不匹配。引用的短语可能在输入中的任何地方。。。开头、中间、结尾等。 我还没能想出一个正则表达式来匹配不在引号中的单词,引号中可能有空格。。。我已经能够匹配一些东西,比

    • 问题内容: 我问这个问题有点傻,但是从我读过的所有内容来看,这应该有效,但对我而言却无效。我只是想使用正则表达式匹配字符串中的整个单词。 因此,如果我试图在句子中找到单词“ the”,则对于“褐狐快速越过懒狗”应该返回true,而对于“褐狐快速越过懒狗”则返回false。 。 我已经试过了: 我也尝试过: 我也尝试过此正则表达式:“ \ bthe \ b” 而且它们总是返回false。我觉得我在这

    • REGEX试图构建一个能够检索单词的第一个字母、该单词的任何其他大写字母以及每个第一个字母(包括同一单词中的任何大写字母)的正则表达式时遇到了麻烦 尝试使用此JUS获得前2个匹配项: 欢迎任何帮助,谢谢