Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将精确单词与正则表达式python匹配?_Python_Regex_Python 3.x - Fatal编程技术网

如何将精确单词与正则表达式python匹配?

如何将精确单词与正则表达式python匹配?,python,regex,python-3.x,Python,Regex,Python 3.x,我试图用正则表达式精确匹配单词,但它并没有像我期望的那样工作。下面是一个小的示例代码和数据,我正在对其进行尝试。我正在尝试匹配字符串中的c和java单词,如果找到,则返回true 我使用的是这个正则表达式\\bc\\b |\\bjava\\b,但它也匹配c#,这不是我想要的。它应该只匹配那个确切的词。我怎样才能做到这一点 def match(x): if re.match('\\bc\\b|\\bjava\\b', x) is not None: return True

我试图用正则表达式精确匹配单词,但它并没有像我期望的那样工作。下面是一个小的示例代码和数据,我正在对其进行尝试。我正在尝试匹配字符串中的
c和java
单词,如果找到,则返回true

我使用的是这个正则表达式
\\bc\\b |\\bjava\\b
,但它也匹配c#,这不是我想要的。它应该只匹配那个确切的词。我怎样才能做到这一点

def match(x):
    if re.match('\\bc\\b|\\bjava\\b', x) is not None:
        return True
    else: return False

print(df)

0                                  c++ c
1            c# silverlight data-binding
2    c# silverlight data-binding columns
3                               jsp jstl
4                              java jdbc
Name: tags, dtype: object

df.tags.apply(match)

0     True
1     True
2     True
3    False
4     True
Name: tags, dtype: bool
预期产出:

0     True
1    False
2    False
3    False
4     True
Name: tags, dtype: bool

您可以使用负向后看和负向前看模式来确保每个匹配关键字的前面和后面都没有非空格字符:

(?<!\S)(?:c|java)(?!\S)

您是否尝试过使用某个正则表达式测试站点,如或??他们将分析你的正则表达式模式,并准确地解释你实际上想要匹配什么。还有很多其他的

我不熟悉python match函数,但它似乎将您的输入模式解析为

\bc\b |\bjava\b


在单词边界上与“c”或“java”匹配。因此,它会在“0”的两端、“1”和“2”的开头找到一个“c”,在“3”中返回“不匹配”,在“4”中匹配“java”,这说明了您的结果。

问题被标记为重复,但上下文似乎不同@如果另一个问题没有帮助,那么问题是
\b
“匹配单词边界处的空字符串(在\w和\w之间)”,并且由于#不够\w\bc\b匹配c#/@kkawabat,因此重新打开该问题。如果愿意,您可以发布答案。
\b
将字母数字字符视为单词字符。由于
#
不是字母数字,它会创建一个单词边界,这就是为什么
c
匹配
\bc\b
@TomKarzes,所以我应该使用类似
\sc\s |\sjava\s
的东西,对吗?我试过了,但它返回的所有内容都是
False
。如果这不是您的意思,您可以在下面将其作为答案发布吗?是的,除了一件事:
\s
需要一个空格字符,因此它在字符串的开头或结尾都不起作用。因此,您需要在字符串的开头或结尾将这些匹配设置为可选。谢谢。我能知道哪种方法通常更快,例如(拆分或正则表达式)?我在列表中有大约一百万个数据点和40k个值要检查。不客气。正则表达式通常比使用适当算法的实现慢得多。请参阅演示:如果要加快速度,请编译正则表达式(一次),然后使用编译后的版本。始终使用
re.compile
编译正则表达式是一个好习惯。我认为Python做了一些缓存,但是显式缓存更快、更可靠(另外,在其他地方重用它们也更容易)。@TomKarzes说得不错。我已经相应地更新了我的演示。
def match(x):
    return any(w in {'c', 'java'} for w in x.split())