繁体   English   中英

使用正则表达式精确搜索带括号的字符串

[英]Exact search of a string that has parenthesis using regex

我是正则表达式的新手。

我有以下字符串: \n(941)\n364\nShackle\n(941)\nRivet\n105\nTop

从这个字符串中,我想提取Rivet并且我已经将(941)作为变量中的字符串。

我的思考过程是这样的:

  1. 找到所有(941) s
  2. 通过检查(941)之后的字符串是否后跟 \n、后跟一个单词并以 \n 结尾来过滤结果
  3. 我为第二部分做了一个正则表达式: \n[\w\s\'\d\-\/\.]+$\n

我面临的问题是,由于(941)中的括号,正则表达式将 941 作为一个组。 在第三步中,正则表达式可能是错误的,我可以稍后修复,但第一步我需要帮助来找到第二步(941) ,所以我可以应用第三步。

PS。

  1. 我知道我可以使用 python 字符串方法,如 find 然后循环搜索,但我想看看这是否可以直接使用正则表达式来完成。
  2. 我尝试了以下正则表达式: (?:...)(941){1}和像这样\(941\)的 make 正则表达式文字字符\没有有用的结果。 也许我用错了。

只是想知道是否可以使用正则表达式来完成。 虽然它可能对其他人也有用,或者对未来的观众来说是一个很好的分享。

谢谢

假设:

  • 你想避免只匹配数字;
  • 想要匹配由单词字符组成的 substring(因此包括可能的数字);

尝试转义变量并通过 f-string 在正则表达式中使用它:

import re
s = '\n(941)\n364\nShackle\n(941)\nRivet\n105\nTop'
var1 = '(941)'
var2 = re.escape(var1)
m = re.findall(fr'{var2}\n(?!\d+\n)(\w+)', s)[0]
print(m)

印刷:

Rivet

如果变量中的文本应该完全匹配,请在替换到正则表达式时使用re.escape()将其转义。

s = '\n(941)\n364\nShackle\n(941)\nRivet\n105\nTop'
num = '(941)'
re.findall(rf'(?<=\n{re.escape(num)}\n)[\w\s\'\d\-\/\.]+(?=\n)', s)

这会将(941)\n放在后面,因此它不包含在匹配中。 这避免了一场比赛结束时的\n与下一场比赛开始时的\n重叠的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM