如何解决使用matchs匹配特定的正则表达式
尝试使用matchs()匹配特定单词
*//id[matches(.,lower-case('*\s?Xander\s?*'))]
示例:
Set of Xanderous- No match
Xander Tray of 6- Match
Tray of 6 pieces Xander- Match
Set of 6 Xander pieces- Match
任何与“ Xander”单词完全匹配的实例都是目标。
解决方法
XPath regex方言不处理单词边界的原因是要正确执行此操作,您需要对语言敏感-“单词”是一种文化人工制品。
您可以执行tokenize(.,'\P{L}+') = 'Xander'
,该令牌将将任何非字母序列作为分隔符进行令牌化,然后测试令牌之一是否为“ Xander”。
我一直在进行一些测试,看来单词边界没有集成到XML / XPATH词汇表中。因此,IMO的下一件事是测试围绕零个或多个字符的空格或起始/结束字符串锚。因此,我最终得到了:
df['name'] = df['name'].ffill()
更好的办法是将*//id[matches(lower-case(.),'.*(^|\s)xander($|\s).*')]
放在一起并使用第三个lower-case
参数(标志)将其设置为不区分大小写的匹配:
matches
,
粗略地说,如果要获得完全匹配的行(如果它完全包含单词Xander
),则可以使用\b
来分隔特定单词,并加上一些 greedy 运算符.*
:
^.*\bXander\b.*$
演示:https://regex101.com/r/PvKptN/1
或者,如果您不需要整行,则只需检查其中是否包含Xander
:
\bXander\b
演示:https://regex101.com/r/PvKptN/2
我希望它能够满足您使用的正则表达式的口味