选择匹配正则表达式后的下一行

问题描述 投票:0回答:3

我目前正在使用扫描软件“Drive Image”从每篇论文中提取某些信息。如果需要,该软件可以运行某些正则表达式代码。它似乎是使用 UltraEdit Regex Engine 运行的。

我得到以下扫描结果:

 1. 21Sid1
 2. Ordernr
 3. E17222
 4. By
 5. Seller

我需要在字符串中搜索文本

Ordernr
,然后选择以下行
E17222
,它最终将成为扫描文档的文件名。我永远不会知道这两个值在字符串中的确切位置。这就是为什么我需要关注
Ordernr
,因为我需要的文本将始终作为下一行。

我的要求是,我需要

E17222
成为比赛结果中唯一的内容才能发挥作用。我只允许输入普通正则表达式。

已经有一个很棒的线程:Regex 来获取匹配字符串后的单词

我已经测试过“ Ordernr\s+\K\S+”,效果很好..

要不是软件不允许使用/K。还有其他实现 \K 的方法吗?

继续

尽管如果示例文本涉及“Ordernr”后面的字符,则当前答案无法达到我需要的程度。喜欢这个示例:

21西德1

订购1

E17222

卖家

当前的解决方案选择“1”,而不是“下一行”,即“E17222”。在匹配组中。需要指出这一点以进一步参与该问题。

regex regex-negation regex-lookarounds
3个回答
47
投票

描述

ordernr[\r\n]+([^\r\n]+)

Regular expression visualization

此正则表达式将执行以下操作:

  • 找到
    ordernr
    子串
  • 将该行放在
    ordernr
    捕获组 1 后面

示例

现场演示

https://regex101.com/r/dQ0gR6/1

示例文本

 1. 21Sid1
 2. Ordernr
 3. E17222
 4. By
 5. Seller

比赛示例

[0][0] = Ordernr
 3. E17222
[0][1] =  3. E17222

说明

NODE                     EXPLANATION
----------------------------------------------------------------------
  ordernr                  'ordernr'
----------------------------------------------------------------------
  [\r\n]+                  any character of: '\r' (carriage return),
                           '\n' (newline) (1 or more times (matching
                           the most amount possible))
----------------------------------------------------------------------
  (                        group and capture to \1:
----------------------------------------------------------------------
    [^\r\n]+                 any character except: '\r' (carriage
                             return), '\n' (newline) (1 or more times
                             (matching the most amount possible))
----------------------------------------------------------------------
  )                        end of \1
----------------------------------------------------------------------

或者

仅使用环视捕获线,以便

ordernr
不包含在捕获组 0 中,并适应
\r
\n

的所有变化
(?<=ordernr\r|ordernr\n|ordernr\r\n)[^\r\n]+

Regular expression visualization

现场演示

https://regex101.com/r/pA4fD4/2


8
投票

进行了一些谷歌搜索,据我所知,

REGEXP.MATCH
的最后一个参数是要使用的捕获组。这意味着您可以使用自己的正则表达式,无需使用
\K
,只需将捕获组添加到要提取的数字即可。

 \bOrdernr\s+(\S+)

这意味着该数字最终会出现在捕获组

1
中(整场比赛都在
0
中,我假设您已经使用过)。

文档不是很清楚,但我猜语法是

REGEXP.MATCH(<ZoneName>, "REGEX", CaptureGroup)

意味着你应该使用

REGEXP.MATCH(<ZoneName>, "\bOrdernr\s+(\S+)", 1)

这里有很多猜测......;)


0
投票

一般来说,如果您必须为此使用正则表达式解决方案,则可以使用

PATTERN.*\n(.*)
PATTERN[^\r\n]*[\r\n]+([^\r\n]*)

并且如果支持 \K 运算符

(如果您无法访问捕获组,则需要该操作符):
PATTERN.*\n\K.*
PATTERN[^\r\n]*[\r\n]+\K[^\r\n]*

或者,如果支持可变宽度lookbehind模式(如在.NET或PyPi正则表达式Python库中):

(?<=PATTERN.*\n).* (?<=PATTERN[^\r\n]*[\r\n]+)[^\r\n]*

其中 
PATTERN

是您要在前一行中匹配的模式。当您不希望

[^\r\n]
在具有此行为的正则表达式库(例如 .NET)中捕获回车符时,请使用
.
版本。

注意

:从文件中读取内容时,必须确保将整个文件读取为单个字符串。例如。在Python中,你必须使用.read(),而不是

.readlines()
,否则,你将无法执行多行匹配。在 Perl 中,您可以
slurp in 
中的文件,在 PowerShell 中使用 Get-Content -Raw
 等。
因此,要在带有图案的一行之后获得

整行

,您可以使用 with open("data.txt", "r") as f: match = re.search(r'Ordernr.*\n(.*)', f.read()) if match: print(match.group(1))

请参阅 
此正则表达式演示

为了仅获得

E17222

,您可以精确地使用

(.*)
模式:比如说,您想要匹配以大写字母开头的第一个整个单词,然后匹配其后的任何数字,直到单词结尾。那么就会是
.*?\b([A-Z][0-9]+)
:
with open("data.txt", "r") as f:
    match = re.search(r'Ordernr.*\n.*?\b([A-Z][0-9]+)', f.read())
    if match:
        print(match.group(1))

请参阅 
此正则表达式演示

© www.soinside.com 2019 - 2024. All rights reserved.