我目前正在使用扫描软件“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”。在匹配组中。需要指出这一点以进一步参与该问题。
ordernr[\r\n]+([^\r\n]+)
此正则表达式将执行以下操作:
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]+
现场演示
进行了一些谷歌搜索,据我所知,
REGEXP.MATCH
的最后一个参数是要使用的捕获组。这意味着您可以使用自己的正则表达式,无需使用 \K
,只需将捕获组添加到要提取的数字即可。
\bOrdernr\s+(\S+)
这意味着该数字最终会出现在捕获组
1
中(整场比赛都在 0
中,我假设您已经使用过)。
文档不是很清楚,但我猜语法是
REGEXP.MATCH(<ZoneName>, "REGEX", CaptureGroup)
意味着你应该使用
REGEXP.MATCH(<ZoneName>, "\bOrdernr\s+(\S+)", 1)
这里有很多猜测......;)
一般来说,如果您必须为此使用正则表达式解决方案,则可以使用
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))
请参阅此正则表达式演示