【问题标题】:how to use regex to grab the eighth word如何使用正则表达式抓取第八个单词
【发布时间】:2012-12-07 11:58:27
【问题描述】:

正则表达式新手 我见过的示例显示搜索非常具体的异常,即。特定的字母组合。

我想要的是抢到第8个字,不管前面是什么,不管那些字是什么。

所以空格是指“单词”

示例行将是

9 月 20 日 11:13:18 10.50.3.100 9 月 20 日 11:13:15 DC1ASM1.dcl.greendotcorp.com Blah Blah Blah

我想提取主机名,在本例中为“DC1ASM1.dcl.greendotcorp.com”,它总是以“月、日、时间戳、IP、月、日、时间戳”模式开头。

谢谢 雷克斯

【问题讨论】:

  • 您使用什么语言/工具集?如果您可以访问 Unix 命令行,则为此构建了 cut 实用程序,因为它看起来像是日志数据。
  • 谢谢迈克尔。这是python(但通过工具)

标签: regex extract token


【解决方案1】:

此表达式将捕获命名组HostName 中的主机名。它假定总是只有一个空格。

^([^ ]+ ){7}(?<HostName>[^ ]+)

两个句柄多个空格使用下面的表达式。

^([^ ]+ +){7}(?<HostName>[^ ]+)

要同时支持选项卡,请使用以下表达式。

^([^ \t]+[ \t]+){7}(?<HostName>[^ \t]+)

【讨论】:

  • ^([^ ]+ ){7}(?[^ ]+) 是完美的。谢谢。
【解决方案2】:

我不能 100% 确定您使用的是什么版本或风格的正则表达式,所以我将避免后视并改用非捕获组:

^(?:\S+?\s){7}(\S+)

绑定到行首,忽略 7 个连续模式 [任何字符,除了空格] 1+ 次] 然后 [一个单个空格字符]

不过,如果您愿意,可以使用 \w 而不是 \S 来更具体地了解“单词”。

【讨论】:

  • +1 表示非捕获组,但您实际上不需要 ?,因为 \S\s 是互斥的
【解决方案3】:

尝试类似

regex = "([^\s]+\s+){7}(?<eighthword>[^\s]+)"

【讨论】:

  • OP 没有说他使用的是什么正则表达式风格,所以你不知道named groups 可用。此外,\w+ 在这种情况下也不起作用,因为某些单词包含“非单词”字符,例如 .:
  • 如果对您有帮助,也许您可​​以将其视为正则表达式伪代码。请注意仔细放置的“类似的东西”,我已为您的兴趣突出显示。旨在给出一个想法。实现留给感兴趣的读者。但是,感谢您对 \w 的观察。那是有用的部分。也许您想提供一个答案。你能解释一下命名组是什么吗?我认为这是您必须知道的事情,因为您已链接到它。
  • 您能否解释一下跨正则表达式“风味”的命名组的差异?因为你似乎也知道那个有用的话题。
  • 我认为我链接到的页面很好地解释了命名组;这就是我链接到它的原因。我之所以提出它,是因为考虑到问题的介绍性水平,我认为假设 OP 在看到命名组语法时会识别它是不安全的。至于贡献我自己的答案,它与Brad's 几乎相同,所以我赞成他的。
  • 有道理。实际上,您是否能够链接到解释 Brad 中该语法的某个地方。 ?:\S+?\s - 我不明白 ?在这里做,或:。另外,我刚刚有一个想法,我想编写一个项目,用简单的英语解释你提供的任何正则表达式正在做什么。你认为这是个好主意/有用吗?你似乎是正则表达式的首选。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
  • 2015-12-15
  • 1970-01-01
相关资源
最近更新 更多