匹配字符串中的关键字是否以非字母数字单词开头/结尾或两者都匹配

时间:2019-07-07 11:21:50

标签: python regex python-3.x

我用简单的英语表达的要求

匹配字符串中的关键字是否以非字母数字单词开头或结尾或同时以非字母数字匹配或完全匹配

关键字:中国

'CHINA', #match
'CHINA ROM' #match
'CHINA WAREHOUSE', #match
'CHINA-WAREHOUSE', #match
'CHINA-ROM', #match
'dsa china', #match
'CHINALOCAL', #No
'CHINAOO' #No

根据我目前对正则表达式的了解,我可以做类似

的操作
keyword = keyword.lower()
if keyword == '' string \ 
    or re.match(r"china[^a-zA-Z0-9]", keyword, flags=re.IGNORECASE) \
    or re.match(r"[^a-zA-Z0-9]china", keyword, flags=re.IGNORECASE) \
    or re.match(r"[^a-zA-Z0-9]china[^a-zA-Z0-9]", keyword, flags=re.IGNORECASE):
    print("matched")

是否有可以执行我想要的所有检查的单个正则表达式?

2 个答案:

答案 0 :(得分:2)

对于示例数据,您可以使用

^(?:[A-Za-z]+ )*china(?:[ -][A-Za-z]+)*$
  • ^字符串的开头
  • (?:[A-Za-z]+ )*重复0+次,匹配1+次A-Za-z,后跟一个空格
  • china字面上匹配
  • ?:[ -][A-Za-z]+)*重复0+次匹配空格或-,然后1+次A-Za-z
  • $字符串结尾

Regex demo

答案 1 :(得分:1)

data = [
"'CHINA'",
"'CHINA ROM'",
"'CHINA WAREHOUSE'",
"'CHINA-WAREHOUSE'",
"'CHINA-ROM'",
"'dsa china'",
"'CHINALOCAL'",
"'CHINAOO'",
]

import re

for d in data:
    if re.findall(r'[^a-z]china[^a-z]', d, flags=re.I):
        print('{: <20} match!'.format(d))
    else:
        print('{: <20} not match!'.format(d))

打印:

'CHINA'              match!
'CHINA ROM'          match!
'CHINA WAREHOUSE'    match!
'CHINA-WAREHOUSE'    match!
'CHINA-ROM'          match!
'dsa china'          match!
'CHINALOCAL'         not match!
'CHINAOO'            not match!

编辑:正如Wiktor在评论中所说,re.findall(r'\bchina\b', d, flags=re.I)可能就是您想要的!