对于多种情况,在Python正则表达式中获取内部字符串的正确方法是什么

2024-05-20 00:55:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我想返回指定起始字符串和结束字符串中的所有字符串

给定一个字符串libs = 'libr(lib1), libr(lib2), libr(lib3), req(reqlib), libra(nonlib)'

从上面的libs字符串中,我想搜索介于libr()之间的字符串,或者介于req()之间的字符串

我想返回['lib1', 'lib2', 'lib3', 'reqlib']

import re 
libs = 'libr(lib1), libr(lib2), libr(lib3), req(reqlib), libra(nonlib)'
pat1 = r'libr+\((.*?)\)'
pat2 = r'req+\((.*?)\)'
pat = f"{pat1}|{pat2}"
re.findall(pat, libs)

上面的代码当前返回[('lib1', ''), ('lib2', ''), ('lib3', ''), ('', 'reqlib')],我不确定应该如何修复它


Tags: 字符串importrereqlibslibrapatlib3
3条回答

我认为这样做的一种常见方法是在您想要捕获的模式之前的单词中使用交替:

\b(?:libr|req)\(([^)]+)

请参阅联机demo

  • \b-字边界
  • (?:-打开非捕获组:
    • libr|req-匹配“libr”或“req”
    • )-关闭非捕获组
  • \(-一个字面上的开场白
  • (-打开捕获组:
    • [^)]+-除了结束符之外,还要匹配1+个字符
    • )-关闭捕获组

python演示:

import re
libs = 'libr(lib1), libr(lib2), libr(lib3), req(reqlib), libra(nonlib)'
lst = re.findall(r'\b(?:libr|req)\(([^)]+)', libs)
print(lst)

印刷品:

['lib1', 'lib2', 'lib3', 'reqlib']

您可以这样做:

pat1 = r'(?<=libr\().*?(?=\))'
pat2 = r'(?<=req\().*?(?=\))'

它使用正的lookback(?<=)和正的lookahead(?=)

  • .*?:选择中间的所有字符。我将它命名为“内容”
  • (?<=libr\():“content”前面必须加libr((我们逃避 (
  • ?(?=\)):内容后面必须跟)(也转义)

完整代码:

import re 
libs = 'libr(lib1), libr(lib2), libr(lib3), req(reqlib), libra(nonlib)'
pat1 = r'(?<=libr\().*?(?=\))'
pat2 = r'(?<=req\().*?(?=\))'
pat = f"{pat1}|{pat2}"
result = re.findall(pat, libs)
print(result)

输出:

['lib1', 'lib2', 'lib3', 'reqlib']

试试这个正则表达式

(?:(?<=libr\()|(?<=req\())[^)]+

Click for Demo

Click for Code

说明:

  • (?:(?<=libr\()|(?<=req\())
    • (?<=libr\()-与紧跟在文本前面的位置匹配的正向查找libr(
    • |-或
    • (?<=req\()-与紧跟在文本前面的位置匹配的正向查找req(
  • [^)]+-匹配非)字符的1+次出现次数。因此,这将匹配所有内容,直到找到下一个)

相关问题 更多 >