![정규식을 사용하여 단일 부동소수점을 0으로 바꾸는 방법](https://linux55.com/image/194821/%EC%A0%95%EA%B7%9C%EC%8B%9D%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EB%8B%A8%EC%9D%BC%20%EB%B6%80%EB%8F%99%EC%86%8C%EC%88%98%EC%A0%90%EC%9D%84%200%EC%9C%BC%EB%A1%9C%20%EB%B0%94%EA%BE%B8%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
나는 Python 스크립트를 작성 중이며 코드의 특정 지점에서 사용자에게 정수 또는 부동 소수점을 입력하도록 요청하고 정규식을 사용하여 올바른 값을 입력했는지 확인합니다.
이것은 내 스크립트의 입력 부분입니다.
import re
ask = input('Please enter some number or float: ')
match = re.match('\d+\.\d+|\d+', ask)
if match:
print(match.group())
else:
print('[!] Invalid value !')
이제 사용자가 float를 입력하면 22.
일치가 이루어지지만 22
그렇게 되기를 바랍니다.22.0
만약 그가 들어오면 .22
게임은 끝나겠지만 None
, 그렇게 되기를 바라요0.22
정규식을 사용하여 이 작업을 어떻게 수행할 수 있나요?
답변1
쉼표 앞이나 뒤에 숫자가 없을 수 있는 숫자를 일치시키려면 와 같은 정규 표현식이 필요합니다 \d+(\.\d*)?|\.\d+
.
기본적으로 다음과 같은 네 가지 상황이 있습니다.
123
123.456
123.
.456
정수 부분과 소수 부분을 모두 선택 사항으로 만들 수는 없습니다. 포인트도 선택 사항이고 포인트 자체만으로는 허용되어서는 안 되기 때문입니다.
최소한 두 가지 옵션이 필요합니다. \d+(\.\d*)?
정수 부분이 있는 숫자와 일치하며, 선택적으로 소수 부분에 점이 있고 0개 이상의 숫자가 뒤따르므로 처음 세 가지 경우가 해당됩니다. 두 번째 부분은 점으로 시작하고 뒤에 숫자가 오는 마지막 경우와 일치합니다.
여전히 있는 그대로 반환되지만 .22
점이 22.
첫 번째 문자인지 마지막 문자인지 확인하기 위한 검사를 쉽게 추가하고 누락된 0을 추가할 수 있습니다. 예를 들어 re.sub()
:
#!/usr/bin/python3
import re, sys
m = re.match("^(\d+(\.\d*)?|\.\d+)$", sys.argv[1])
if not m:
print("no match")
exit(1)
s = m.group()
print(s)
s = re.sub("^\.", "0.", s);
s = re.sub("\.$", ".0", s);
print(s)