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

标签 python regex list tokenize

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

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

我执行以下操作:

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/

相关文章:

c - 如何自动化可变输入数组列表

python - 如何获取没有图像的 rect 属性

php - Perl 相当于 PHP 的 preg_callback

javascript - 将 PHP preg_match 转换为 javascript

java - ArrayList<CustomClass> 中的 JSON 对象始终覆盖前一个对象。怎么解决?

python - 为什么两个相同的列表有不同的内存占用?

PHP(或PYTHON)将所有包含的文件合并到一个大文件中(递归?)

python - Airflow Python 运算符传递参数

python - 如何在Python中生成JWT断言

javascript - 只有数字。在React中输入数字