python正则表达式表示数字,末尾带有可选的*



我很难找到以下示例的正则表达式模式(在python中(

字符串应该以1到99之间的数字开头,2或3个CCD_ 1标记。其他任何东西都是无效的

  • ""->NOK(必须至少包含一个数字(
  • "1"->ok
  • "99"->ok
  • "100"->NOK(最大数量为99(

  • "1*"->ok

  • "1**"->好
  • "1***"->好
  • "1****"->NOK(最大3*s(

  • *0->ok

  • "*1"->NOK(*仅在背面(

  • "1*1"->NOK(*仅在背面(
  • "1 *"->NOK(包含空格:不是数字或*(

我走到了这一步:"^[0-9]{1,2}|^([0-9]{1,2})(Z*)"但未发现CCD_ 15或CCD_

以下是python代码和测试:


import re
class ControlePunt:
@staticmethod
def create(punt):
should_start_with_number_and_may_end_with_marker = "^[0-9]{1,2}|^([0-9]{1,2})(Z*)"
if re.match(should_start_with_number_and_may_end_with_marker, punt):
return ControlePunt(punt)
else:
return NoControlePunt()
def __init__(self, punt):
self.punt = punt

class NoControlePunt(ControlePunt):
def __init__(self):
super().__init__("")

import unittest
from ControlePunt import ControlePunt, NoControlePunt

class ValidControlePuntTests(unittest.TestCase):
def test_valid_numeric(self):
self.assertEqual(ControlePunt.__name__, type(ControlePunt.create("21")).__name__)
def test_valid_numeric_with_1_marker(self):
self.assertEqual(ControlePunt.__name__, type(ControlePunt.create("21*")).__name__)
def test_valid_numeric_with_2_markers(self):
self.assertEqual(ControlePunt.__name__, type(ControlePunt.create("21**")).__name__)
def test_valid_numeric_with_3_markers(self):
self.assertEqual(ControlePunt.__name__, type(ControlePunt.create("21***")).__name__)

class InvalidControlePuntTests(unittest.TestCase):
def test_empty(self):
self.assertEqual(NoControlePunt.__name__, type(ControlePunt.create("")).__name__)
def test_only_marker(self):
self.assertEqual(NoControlePunt.__name__, type(ControlePunt.create("*")).__name__)
def test_non_numeric(self):
self.assertEqual(NoControlePunt.__name__, type(ControlePunt.create("a1")).__name__)
def test_marker_before_numbers(self):
self.assertEqual(NoControlePunt.__name__, type(ControlePunt.create("*1")).__name__)
def test_marker_surrounded_by_numbers(self):
self.assertEqual(NoControlePunt.__name__, type(ControlePunt.create("1*1")).__name__)
def test_containing_illegal_characters(self):
self.assertEqual(NoControlePunt.__name__, type(ControlePunt.create("1 *")).__name__)

if __name__ == '__main__':
unittest.main()

也许这个正则表达式会有所帮助?

should_start_with_number_and_may_end_with_marker = "^[1-9][0-9][*]{0,3}"

Regex:r'^[1-9][0-9]?[*]{0,3}$'

匹配测试用例。

解释

  • ^[1-9]-1到9是第一个字符
  • [0-9]?-可选第二个字符0到9
  • [\*]{0,3}$-字符串末尾的0到3*

相关内容

  • 没有找到相关文章

最新更新