我需要找到一个索引,在该索引处,字符串中出现带字母a-z的小写单词。但是,字符串中可能包含一堆非字母字符。
例如,单词“dont”在短语“不要那样做”中跨越索引[0,5]。
我搜索了匹配非字母字符的方法,并使用以下正则表达式实现了这一点:
>>> import re
>>> pattern = re.compile("d[^a-z]*o[^a-z]*n[^a-z]*t[^a-z]*")
>>> test = "don't"
>>> pattern.search(test).start()
0
>>> pattern.search(test).end()
5
>>> test = "d'o&&&&&n't"
>>> pattern.search(test).start()
0
>>> pattern.search(test).end()
11
>>>
有没有更简洁的方式表达这个正则表达式?或者我是否必须编写代码以在我想要搜索的每个单词中的每个字符之间插入[^ a-z] *?
很抱歉,如果这个问题已经存在 - 我不确切地知道如何说出这个问题。谢谢你的帮助。
答案 0 :(得分:1)
您可以使用非捕获组下的重复来匹配每个小写单词:
(?:[a-z][^a-z]*)+
或者,您可以为每个给定的单词自动执行此正则表达式:
>>> word = 'dont'
>>> regex = ''.join(x + '[^a-z]*' for x in word)
>>> regex
'd[^a-z]*o[^a-z]*n[^a-z]*t[^a-z]*'
答案 1 :(得分:1)
是的,如果真的是你的意图,你必须按照你展示的方式去做。
正则表达式仅匹配特定字符或字符类型的后续序列。它无法知道您需要仅将d&&o
与d
和o
匹配,因为还有其他字符必须匹配。
答案 2 :(得分:0)
试试这个:
pattern = re.compile("[^\w']|don't")