gpt4 book ai didi

python - 如何匹配正则表达式并获取先行词

转载 作者:行者123 更新时间:2023-12-01 08:28:34 25 4
gpt4 key购买 nike

我使用正则表达式来匹配文本中的某些表达式。

假设我想匹配一个数字或用逗号分隔的数字(包括或不包括空格),所有这些都在文本中的括号内。 (实际上匹配更复杂,包括空格等)

我执行以下操作:

import re
pattern =re.compile(r"(\()([0-9]+(,)?( )?)+(\))")
matches = pattern.findall(content)

matches 是包含匹配项的列表,

for i,match in enumerate(matches):
print(i,match)

示例文本:

Lorem ipsum dolor sat amet (12,16) ,consectetur 23 adipiscing elit。 Curabitur (45) euismod scelerisque consectetur。 Vivamus aliquam velit (46,48,49) at augue faucibus, id eleifend purus egestas。 Aliquam vitae mauris cursus、facilisis enim condimentum、前庭 enim。现在

enter image description here

问题 1如何获取完整匹配的列表,例如:

matches=[ "(12,16)", "(45)", "(46,48,49)"]

问题 2:如何获取完整匹配的前 n 个单词的列表?我正在尝试将文本拆分为单词。这里的一个问题是命中 (12,16) 可能在文本中出现多次。使用时的第二个问题:

mywordlist=text.split(' ') 

可能也会拆分匹配,以防我想将标点符号与单词分开,并且 () 内有空格。在示例中,我想要取回的单词是图片中手动划线的单词。比赛前4个字:

"ipsum dolor sit amet"         (12,16) 
"adipiscing elit. Curabitur" (45)
". Vivamus aliquam velit" (46,48,49)

发表一些评论后:print(matches) 给了我:

matches = pattern.findall(content)
print('the matches are:')
print('type of variable matches',type(matches))
print(matches)

[('(', '16', ',', ')'), ('(', '45', '', ')'), ('(', '49', ',', ')')]

最佳答案

更改了正则表达式的示例代码 - 此处测试:https://regex101.com/r/mV1l3E/3

import re

regex = r"(\w+ (?=\(\d))(\([\d,]+\))"

test_str = """bla kra tu (34) blaka trutra (33,45) afda
bla kra tu (34) blaka trutra (33,45) afdabla kra tu (34) blaka trutra (33,45) afda
bla kra tu (34) blaka trutra (33,45) afda"""

matches = re.findall(regex, test_str, re.MULTILINE)

print(matches)

for first_matching_group, number_group in matches:
print(first_matching_group, "===>", number_group)

输出:

# matches (each a tuple of both matches
[('kra tu ', '(34)'), ('blaka trutra ', '(33,45)'), ('kra tu ', '(34)'),
('blaka trutra ', '(33,45)'), ('kra tu ', '(34)'), ('blaka trutra ', '(33,45)'),
('kra tu ', '(34)'), ('blaka trutra ', '(33,45)')]


# for loop output
('kra tu ', '===>', '(34)')
('blaka trutra ', '===>', '(33,45)')
('kra tu ', '===>', '(34)')
('blaka trutra ', '===>', '(33,45)')
('kra tu ', '===>', '(34)')
('blaka trutra ', '===>', '(33,45)')
('kra tu ', '===>', '(34)')
('blaka trutra ', '===>', '(33,45)')

模式解释:

(\w+ (?=\(\d))(\([\d,]+\))
--------------============

模式中有两个组,------ 组查找由空格分隔的 2 个单词,不使用多个单词字符 (\w+),并先行查找左左括号和一位数字(您可能需要在此处包含完整的第二个模式以避免不匹配)。第二个模式 ======== 查找括号+多个数字和逗号,后跟右括号。

regexr101 https://regex101.com/r/mV1l3E/3/ 的链接如果您在正则表达式字段中复制该模式,则可以更好地以彩色方式解释它。

该模式不会找到任何前面没有 2 个单词的 (42) - 如果这也是一个用例,您将不得不尝试一下。

<小时/>

编辑:

也许稍微好一点的正则表达式:r'((?:\w+ ?){1,5}(?=\(\d))(\([\d,]+\))' - 前面只需要 1 个单词 ( https://regex101.com/r/mV1l3E/5/ )

关于python - 如何匹配正则表达式并获取先行词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54055163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com