【问题标题】:Capture word from regex match从正则表达式匹配中捕获单词
【发布时间】:2016-02-07 01:10:45
【问题描述】:

我正在研究 perl 中的正则表达式,它标识了我想要的:单词结尾 g(但不跟在 'n' 之后)或 k(但不跟在 'r' 之后),在单词首字母 g 之前(但不是 l 或 r)、词首 k 或词首 c(但不是 i、e、y 或 h 之前的 c):

(((?<!n)g)|(?<!r)k)\s(g(?!l|r)|k|c(?!i|e|y|h));

但是,我希望它能够捕获以 g 或 k 结尾的单词,所以我尝试了这样的操作: (^|\s.*(((?<!n)g)|(?<!r)k))\s(g(?!l|r)|k|c(?!i|e|y|h)); 以便 $1 捕获行的开头或空格(表示单词的开头),直到 g、k 或 c(单词的结尾)之前的下一个空格。也许这是一个括号问题,但我不确定如何保持我的分组,同时还指定我希望 $1 捕获的位置。

【问题讨论】:

  • 在 What Have You Tryed 前面做得很好,但为了更清楚:您可以添加一些 To match 和 To Not match 单词吗?
  • 是的,对不起!这里说几句废话。比赛:bog go,时钟枪,野猪风筝。不匹配:说话围棋、方舟胶、树皮抓斗。
  • 您的情况相当复杂,似乎有点武断。这是为了家庭作业(如果是的话,那就太好了)还是你想解决一个现实世界的问题?如果这是一个现实世界的问题,我很好奇它是什么。自然语言处理之类的?
  • 我对其他停止辅音之前的词尾软颚音很感兴趣——这个正则表达式是软颚音在软颚音之前的“控制”情况。我想将其与日冕和唇部之前的软膜进行比较(更具体地说,寻找这两者中的同化案例)。我正在使用的语料库不是按语音转录的,所以我正在使用正字法。感谢您的关注!
  • 这是一个很好的例子,说明了为什么“单一魔法正则表达式”是一件坏事。

标签: regex perl


【解决方案1】:

/(\S*(((?<!n)g)|(?<!r)k))\s(g(?!l|r)|k|c(?!i|e|y|h))/ 呢?

编辑:看着它,它可以使用一些清理:D

/(\S*([^n]g|[^r]k))\s(g[^lr]|k|c[^ieyh])/

【讨论】:

  • 这很完美!谢谢你。我是 perl 和正则表达式的新手,所以我经常怀疑我的代码中有不必要的东西,所以谢谢你帮我清理它!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多