Regex 正则表达式-如何在一行中排除两个字符的同时匹配单个字符?
我试图使用正则表达式匹配以下示例中的属性名称(“SUP NR”、“QUANTITY”、“MOD/REF”): 辅助编号:K16518-1,数量:2件//型号/参考号:16-1P1-0612 注:Regex 正则表达式-如何在一行中排除两个字符的同时匹配单个字符?,regex,Regex,我试图使用正则表达式匹配以下示例中的属性名称(“SUP NR”、“QUANTITY”、“MOD/REF”): 辅助编号:K16518-1,数量:2件//型号/参考号:16-1P1-0612 注: 属性名称后面始终跟有“:”字符 属性可以由多个单词组成,可以用空格(“SUP-NR”)分隔,也可以用/(“MOD/REF”)分隔 开头有一个空格字符(在“SUP NR”之前) 我尝试使用以下正则表达式执行此操作: (?<=\s)[a-zA-Z\s/]+: (?您可以使用此正则表达式: \s(
- 属性名称后面始终跟有“:”字符
- 属性可以由多个单词组成,可以用空格(“SUP-NR”)分隔,也可以用/(“MOD/REF”)分隔
- 开头有一个空格字符(在“SUP NR”之前)
(?<=\s)[a-zA-Z\s/]+:
(?您可以使用此正则表达式:
\s([a-zA-Z]+(?:[/\s][a-zA-Z]+)*):
它查找前面有空格的单词,后面是可选的分隔符组(空格或/
),另一个单词后面是:
。对于您的数据组,1是SUP NR
,QUANTITY
和MOD/REF
对于python,您可以像这样使用这个正则表达式:
import re
string = " SUP NR: K16518-1, QUANTITY: 2 PIECES// MOD/REF: 16-1P1-0612"
regex = re.compile('\s([a-zA-Z]+(?:[/\s][a-zA-Z]+)*):')
print regex.findall(string)
输出:
['SUP NR', 'QUANTITY', 'MOD/REF']
你不需要背后看。你也可以更具体一些
试试这个:
[a-zA-Z]+([ /][a-zA-Z]+)*(?=:)
看
顺便说一句,您的lookbehind不是消极的lookbehind,而是积极的lookbehind-消极的lookbehind使用语法(?这确实适用于regex101,但是当我在sublime或python中尝试它时(重新打包)它不起作用..原因可能是什么?@nkaenzig我添加了python代码,显示正则表达式工作正常。谢谢你的回答。你说得对,它在文章中的示例中起作用。但是当我在更大的数据集上运行它时,它会冻结(在sublime&python中发生)@nkaenzig您能找出它冻结在什么数据上吗?@nkaenzig我已经更新了正则表达式,以避免可能导致冻结问题的灾难性回溯。这只适用于只包含两个单词的属性名称。它还应该适用于包含更多单词的属性。@nkaenzig已修复(基本上将?
更改为*
)