8000 Handle case where Word(min > 1) with differing init and body chars · pyparsing/pyparsing@411c8ab · GitHub
[go: up one dir, main page]

Skip to content

Commit 411c8ab

Browse files
committed
Handle case where Word(min > 1) with differing init and body chars
1 parent 1936b36 commit 411c8ab

File tree

3 files changed

+31
-7
lines changed

3 files changed

+31
-7
lines changed

pyparsing/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ def __repr__(self):
121121

122122

123123
__version_info__ = version_info(3, 1, 1, "final", 1)
124-
__version_time__ = "29 Jul 2023 09:56 UTC"
124+
__version_time__ = "29 Jul 2023 10:28 UTC"
125125
__version__ = __version_info__.__version__
126126
__versionTime__ = __version_time__
127127
__author__ = "Paul McGuire <ptmcg.gm+pyparsing@gmail.com>"

pyparsing/core.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2897,19 +2897,17 @@ def __init__(
28972897
repeat = ""
28982898
else:
28992899
re_body_fragment = f"[{_collapse_string_to_ranges(self.bodyChars)}]"
2900-
if max == 0:
2900+
if max == 0 and self.minLen == 1:
29012901
repeat = "*"
29022902
elif max == 2:
29032903
repeat = "?" if min <= 1 else ""
29042904
else:
29052905
if min != max:
2906-
repeat = f"{{{min - 1 if min > 0 else 0},{max - 1}}}"
2906+
repeat = f"{{{min - 1 if min > 0 else ''},{max - 1 if max > 0 else ''}}}"
29072907
else:
2908-
repeat = f"{{{min - 1 if min > 0 else 0}}}"
2908+
repeat = f"{{{min - 1 if min > 0 else ''}}}"
29092909

2910-
self.reString = (
2911-
f"{re_leading_fragment}" f"{re_body_fragment}" f"{repeat}"
2912-
)
2910+
self.reString = f"{re_leading_fragment}{re_body_fragment}{repeat}"
29132911

29142912
if self.asKeyword:
29152913
self.reString = rf"\b{self.reString}\b"

tests/test_unit.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5223,13 +5223,27 @@ def testWordMinMaxExactArgs(self):
52235223

52245224
def testWordMin(self):
52255225
# failing tests
5226+
for min_val in range(3, 5):
5227+
with self.subTest(min_val=min_val):
5228+
wd = pp.Word("a", "1", min=min_val)
5229+
print(min_val, wd.reString)
5230+
with self.assertRaisesParseException():
5231+
wd.parse_string("a1")
5232+
52265233
for min_val in range(2, 5):
52275234
with self.subTest(min_val=min_val):
52285235
wd = pp.Word("a", min=min_val)
52295236
print(min_val, wd.reString)
52305237
with self.assertRaisesParseException():
52315238
wd.parse_string("a")
52325239

5240+
for min_val in range(3, 5):
5241+
with self.subTest(min_val=min_val):
5242+
wd = pp.Word("a", "1", min=min_val)
5243+
print(min_val, wd.reString)
5244+
with self.assertRaisesParseException():
5245+
wd.parse_string("a1")
5246+
52335247
# passing tests
52345248
for min_val in range(2, 5):
52355249
with self.subTest(min_val=min_val):
@@ -5243,6 +5257,18 @@ def testWordMin(self):
52435257
verbose=True,
52445258
)
52455259

5260+
for min_val in range(2, 5):
5261+
with self.subTest(min_val=min_val):
5262+
wd = pp.Word("a", "1", min=min_val)
5263+
test_string = "a" + "1" * (min_val - 1)
5264+
self.assertParseAndCheckList(
5265+
wd,
5266+
test_string,
5267+
[test_string],
5268+
msg=f"Word(min={min_val}) failed",
5269+
verbose=True,
5270+
)
5271+
52465272
def testWordExact(self):
52475273
# failing tests
52485274
for exact_val in range(2, 5):

0 commit comments

Comments
 (0)
0