正则表达式,不包括以冒号开头的单词

时间:2018-02-17 03:24:24

标签: python regex

我一直试图弄清楚如何包含某些单词组并排除其他单词组。我有这个字符串例如

string1="HI:MYDLKJL:ajkld? :JKLJBLKJD:DKJL? app?"

我想找到HI:MYDLKJL:ajkld?app?但不是:JKLJBLKJD:DKJL?,因为它以a开头:我已经制作了这段代码,但它仍然包含:JKLJBLKJD:DKJL?只是忽略了:在前面

match3=re.findall("[A-Za-z]{1,15}[:]{0,1}[A-Za-z]{0,15}[:]{0,1}[A-Za-z]{0,15}[:]{0,1}[A-Za-z]{0,15}[\?]{1}",string1)

2 个答案:

答案 0 :(得分:2)

指定实际模式非常简单。但是,你 还需要指定一个后视来适当地处理第二个词。

<li>

正则表达式表示&#34;任何不以冒号开头但以问号&#34;结尾的表达式。

>>> re.findall(r'(?:(?<=\s)|(?<=^))[^:]\S+\?', string1)
['HI:MYDLKJL:ajkld?', 'app?']

一个简单的单词边界不起作用,因为(?: # lookbehind (?<=\s) # space | # OR (?<=^) # start-of-line metachar ) [^:] # anything that is not a colon \S+ # one or more characters that are not a space \? # literal question mark 也会匹配\b:之间的边界...没有bueno,因此是后视。

答案 1 :(得分:0)

替代方法

>>> string1="HI:MYDLKJL:ajkld? :JKLJBLKJD:DKJL? app?"
>>> string1.split()
['HI:MYDLKJL:ajkld?', ':JKLJBLKJD:DKJL?', 'app?']

# filter out elements not needed
>>> [s for s in string1.split() if not s.startswith(':')]
['HI:MYDLKJL:ajkld?', 'app?']


或者,使用regex模块

>>> string1="HI:MYDLKJL:ajkld? :JKLJBLKJD:DKJL? app?"
>>> regex.findall(r'(?:^|\s):\S+(*SKIP)(*F)|\S+', string1)
['HI:MYDLKJL:ajkld?', 'app?']
  • (?:^|\s):\S+(*SKIP)(*F)将有效地忽略以:
  • 开头的字符串
  • (?:表示non-capturing group