45

我需要一个 python 正则表达式来检查字符串中是否存在单词。该字符串可能由逗号分隔。

例如,

line = 'This,is,a,sample,string'

我想根据“样本”进行搜索,这将返回 true。我对 reg ex 很不满意,所以当我查看 python 文档时,我看到了类似的东西

import re
re.match(r'sample', line)

但我不知道为什么要匹配的文本前有一个“r”。有人可以帮我处理正则表达式吗?

4

6 回答 6

73

你确定你需要一个正则表达式吗?似乎您只需要知道字符串中是否存在单词,因此您可以这样做:

>>> line = 'This,is,a,sample,string'
>>> "sample" in line
 True
于 2013-10-10T15:32:58.163 回答
30

使r字符串成为原始字符串,它不处理转义字符(但是,由于字符串中没有转义字符,因此这里实际上不需要它)。

此外,re.match从字符串的开头匹配。换句话说,它在字符串和模式之间寻找完全匹配。要匹配字符串中可能存在的任何内容,请使用re.search. 请看下面的演示:

>>> import re
>>> line = 'This,is,a,sample,string'
>>> re.match("sample", line)
>>> re.search("sample", line)
<_sre.SRE_Match object at 0x021D32C0>
>>>
于 2013-10-10T15:30:07.790 回答
9

r 代表原始字符串,所以像 \ 这样的东西会被 Python 自动转义。

通常,如果您希望您的模式包含类似反斜杠的内容,则需要使用另一个反斜杠对其进行转义。原始字符串消除了这个问题。

简短的解释

在你的情况下,这并不重要,但早点进入是一个好习惯,否则如果你不小心,像 \b 这样的东西会在后面咬你(将被解释为退格字符而不是单词边界)

根据 re.match vs re.search 这里有一个例子可以为你澄清:

>>> import re
>>> testString = 'hello world'
>>> re.match('hello', testString)
<_sre.SRE_Match object at 0x015920C8>
>>> re.search('hello', testString)
<_sre.SRE_Match object at 0x02405560>
>>> re.match('world', testString)
>>> re.search('world', testString)
<_sre.SRE_Match object at 0x015920C8>

所以搜索会在任何地方找到匹配,匹配只会从开头开始

于 2013-10-10T15:32:03.723 回答
4

您不需要正则表达式来检查字符串中是否存在子字符串。

line = 'This,is,a,sample,string'
result = bool('sample' in line) # returns True

如果您想知道字符串是否包含模式,那么您应该使用re.search

line = 'This,is,a,sample,string'
result = re.search(r'sample', line) # finds 'sample'

这最好与模式匹配一​​起使用,例如:

line = 'my name is bob'
result = re.search(r'my name is (\S+)', line) # finds 'bob'
于 2013-10-10T15:34:03.243 回答
2

正如其他人所提到的,最好使用“in”运算符,它也可以作用于列表:

line = "This,is,a,sample,string"
lst = ['This', 'sample']
for i in lst:
     i in line

>> True
>> True
于 2013-10-15T17:09:50.147 回答
-2

一班轮实施:

a=[1,3]
b=[1,2,3,4]
all(i in b for i in a)
于 2017-05-24T12:09:50.237 回答