Regex表示不以特定字符开头或结尾的Python字符串

9rnv2umw  于 2023-06-07  发布在  Python
关注(0)|答案(2)|浏览(131)

我需要处理中间不能有*的输入字符串,但如果它确实以*开始或结束,它需要以*.开始或以.*结束(不能两者都有,最多允许一个*
第一部分是检查它中间是否有*,但是如果它以*开始或结束而没有.,那么它也是无效的。

import re

def invalid_syntax(str):
    regex_str = '(?<!^)\*(?!$)'
    if re.search(regex_str, str):
        return True
    return False

它应该表现如下:

invalid_syntax('exampleStr') == False
invalid_syntax('*.exampleStr') == False
invalid_syntax('*exampleStr') == True
invalid_syntax('examp*leStr') == True
invalid_syntax('ex*ampleStr') == True
invalid_syntax('exampleStr*') == True
invalid_syntax('*.exampleStr*') == True
invalid_syntax('*.exampleStr.*') == True
invalid_syntax('exampleStr.*') == False
mw3dktmi

mw3dktmi1#

如果正则表达式被证明是一个斗争,考虑使用标准字符串操作代替。这可能会导致代码更接近于问题陈述,并且更容易理解/维护:

def test(s):
    """ I need to process input strings that cannot have * in the
        middle, but if it does start or end with *, it needs to start
        with *. or end with .* (cannot have both, max of one * allowed)
    """
    c = s.count('*')
    return c == 0 or c == 1 and (s.startswith('*') or s.endswith('*'))

下面是一个测试运行:

>>> for s in ['*okay', 'okay*', 'okay', 'not*okay', '*']:
...     print(test(s), repr(s), sep='\t')
True    '*okay'
True    'okay*'
True    'okay'
False   'not*okay'
True    '*'

注意,问题规范并不是100%清楚是否允许单个*。可能这应该被拒绝,因为它既以恒星开始又以恒星结束。要添加此要求,只需添加and len(s) != 1

fae0ux8s

fae0ux8s2#

如果你想要一个正则表达式,你可以尝试(regex101):

^[^*]*$|^\*\.[^*]*$|^[^*]+\.\*$
  • ^[^*]*$ -> match if string doesn't contain *

或:

  • ^\*\.[^*]*$ -> match if string begins with *. and doesn't contain additional *

或:

  • ^[^*]+\.\*$-> match if string以.*结尾并且不包含额外的*

相关问题