如何匹配正则表达式并获取前缀词
How to match regex expression and get precedent words
我使用正则表达式来匹配文本中的某些表达式。
假设我想匹配一个数字,或者用逗号分隔的数字——包括或不包括空格——,所有这些都在文本的括号内。 (实际上匹配更复杂,包括空格等)
我执行以下操作:
import re
pattern =re.compile(r"(\()([0-9]+(,)?( )?)+(\))")
matches = pattern.findall(content)
匹配列表 匹配,
for i,match in enumerate(matches):
print(i,match)
示例文本:
Lorem ipsum pain sitting with (12,16) consectetur 23 adipiscing elite。可固化性 (45) euismod scelerisque conectetur。 Vivamus aliquam velit (46,48,49) 在 augue faucibus,id eleifend purus egestas。 Aliquam vitae mauris cursus,facilisis enim condimentum,vestibulum enim。目前
问题
完整匹配列表,例如:
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)
一些评论之后:
打印(匹配)给我:
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 个单词 unsing 多个单词字符 (\w+
),并提前打开左括号和一位数字(您可能想要在此处包含完整的第二个模式以避免不匹配)。第二种模式 ========
查找括号 + 多个数字和逗号后跟右括号。
regexr101 的 link https://regex101.com/r/mV1l3E/3/ 如果您在其正则表达式字段中复制模式,则可以用彩色更好地解释它。
该模式找不到任何 (42) 前面有 not 2 个单词 - 如果这也是一个用例,您将不得不尝试一下。
编辑:
可能稍微好一点的正则表达式:r'((?:\w+ ?){1,5}(?=\(\d))(\([\d,]+\))'
- 在 (https://regex101.com/r/mV1l3E/5/)
之前只需要 1 个字
我使用正则表达式来匹配文本中的某些表达式。
假设我想匹配一个数字,或者用逗号分隔的数字——包括或不包括空格——,所有这些都在文本的括号内。 (实际上匹配更复杂,包括空格等)
我执行以下操作:
import re
pattern =re.compile(r"(\()([0-9]+(,)?( )?)+(\))")
matches = pattern.findall(content)
匹配列表 匹配,
for i,match in enumerate(matches):
print(i,match)
示例文本:
Lorem ipsum pain sitting with (12,16) consectetur 23 adipiscing elite。可固化性 (45) euismod scelerisque conectetur。 Vivamus aliquam velit (46,48,49) 在 augue faucibus,id eleifend purus egestas。 Aliquam vitae mauris cursus,facilisis enim condimentum,vestibulum enim。目前
问题 完整匹配列表,例如:
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)
一些评论之后: 打印(匹配)给我:
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 个单词 unsing 多个单词字符 (\w+
),并提前打开左括号和一位数字(您可能想要在此处包含完整的第二个模式以避免不匹配)。第二种模式 ========
查找括号 + 多个数字和逗号后跟右括号。
regexr101 的 link https://regex101.com/r/mV1l3E/3/ 如果您在其正则表达式字段中复制模式,则可以用彩色更好地解释它。
该模式找不到任何 (42) 前面有 not 2 个单词 - 如果这也是一个用例,您将不得不尝试一下。
编辑:
可能稍微好一点的正则表达式:r'((?:\w+ ?){1,5}(?=\(\d))(\([\d,]+\))'
- 在 (https://regex101.com/r/mV1l3E/5/)