문자열에서 부동 숫자를 추출하는 방법
다음과 유사한 문자열이 여러 개 있습니다.Current Level: 13.4 db.
부동 소수점 번호만 추출하고 싶습니다.저는 소수가 아닌 부동이라고 말합니다. 가끔은 전체이기 때문입니다.RegEx가 이를 수행할 수 있습니까? 아니면 더 나은 방법이 있습니까?
만약 당신의 플로트가 항상 10진 표기법으로 표현된다면 다음과 같습니다.
>>> import re
>>> re.findall("\d+\.\d+", "Current Level: 13.4db.")
['13.4']
아마 충분할 것입니다.
보다 강력한 버전은 다음과 같습니다.
>>> re.findall(r"[-+]?(?:\d*\.*\d+)", "Current Level: -13.2db or 14.2 or 3")
['-13.2', '14.2', '3']
사용자 입력의 유효성을 확인하려면 직접 이동하여 플로트를 확인할 수도 있습니다.
user_input = "Current Level: 1e100 db"
for token in user_input.split():
try:
# if this succeeds, you have your (first) float
print(float(token), "is a float")
except ValueError:
print(token, "is something else")
# => Would print ...
#
# Current is something else
# Level: is something else
# 1e+100 is a float
# db is something else
숫자 뒤에 공백을 사용하지 않는 것을 포함하여 모든 기저를 포함하는 다음과 같은 방법을 시도할 수 있습니다.
>>> import re
>>> numeric_const_pattern = r"""
... [-+]? # optional sign
... (?:
... (?: \d* \. \d+ ) # .1 .12 .123 etc 9.1 etc 98.1 etc
... |
... (?: \d+ \.? ) # 1. 12. 123. etc 1 12 123 etc
... )
... # followed by optional exponent part if desired
... (?: [Ee] [+-]? \d+ ) ?
... """
>>> rx = re.compile(numeric_const_pattern, re.VERBOSE)
>>> rx.findall(".1 .12 9.1 98.1 1. 12. 1 12")
['.1', '.12', '9.1', '98.1', '1.', '12.', '1', '12']
>>> rx.findall("-1 +1 2e9 +2E+09 -2e-9")
['-1', '+1', '2e9', '+2E+09', '-2e-9']
>>> rx.findall("current level: -2.03e+99db")
['-2.03e+99']
>>>
간편한 복사 붙여넣기:
numeric_const_pattern = '[-+]? (?: (?: \d* \. \d+ ) | (?: \d+ \.? ) )(?: [Ee] [+-]? \d+ ) ?'
rx = re.compile(numeric_const_pattern, re.VERBOSE)
rx.findall("Some example: Jr. it. was .23 between 2.3 and 42.31 seconds")
Python 문서에는 +/- 및 지수 표기법을 다루는 답변이 있습니다.
scanf() Token Regular Expression
%e, %E, %f, %g [-+]?(\d+(\.\d*)?|\.\d+)([eE][-+]?\d+)?
%i [-+]?(0[xX][\dA-Fa-f]+|0[0-7]*|\d+)
이 정규식은 전체 부분과 부분 부분(3,14159) 사이에 쉼표를 구분 문자로 사용하는 국제 형식을 지원하지 않습니다.이 경우 모두 바꾸기\.
와 함께[.,]
위의 부동 정규식에서.
Regular Expression
International float [-+]?(\d+([.,]\d*)?|[.,]\d+)([eE][-+]?\d+)?
re.findall(r"[-+]?\d*\.?\d+|\d+", "Current Level: -13.2 db or 14.2 or 3")
위에서 설명한 것처럼, 정말 잘 작동합니다!하지만 한 가지 제안은:
re.findall(r"[-+]?\d*\.?\d+|[-+]?\d+", "Current Level: -13.2 db or 14.2 or 3 or -3")
또한 음수 int 값을 반환합니다(이 문자열의 끝에 -3과 같이).
다음 정규식을 사용하여 문자열에서 정수 및 부동 값을 가져올 수 있습니다.
re.findall(r'[\d\.\d]+', 'hello -34 42 +34.478m 88 cricket -44.3')
['34', '42', '34.478', '88', '44.3']
감사합니다 렉스
제가 이전에 비슷한 질문에 대해 했던 다음 답변에서 흥미로운 내용을 찾을 수 있을 것 같습니다.
https://stackoverflow.com/q/5929469/551449
이 답변에서, 저는 정규식이 어떤 종류의 숫자라도 잡을 수 있는 패턴을 제안했고, 저는 그것에 추가할 다른 것이 없기 때문에, 그것은 꽤 완벽하다고 생각합니다.
더 읽기 쉬운 또 다른 접근법은 단순한 유형 변환입니다.나는 사람들이 유럽 소수점을 입력할 수 있는 경우를 다루기 위해 대체 기능을 추가했습니다.
>>> for possibility in "Current Level: -13.2 db or 14,2 or 3".split():
... try:
... str(float(possibility.replace(',', '.')))
... except ValueError:
... pass
'-13.2'
'14.2'
'3.0'
하지만 이것도 단점이 있습니다.누군가 "1,000"을 입력하면 1로 변환됩니다.또한, 그것은 사람들이 단어 사이에 공백을 두고 입력할 것이라고 가정합니다.중국어와 같은 다른 언어는 그렇지 않습니다.
언급URL : https://stackoverflow.com/questions/4703390/how-to-extract-a-floating-number-from-a-string
'source' 카테고리의 다른 글
튜플 형식을 지정하려고 하면 "TypeError: 문자열 형식 지정 중에 변환된 모든 인수가 아님"이 표시되는 이유는 무엇입니까? (0) | 2023.07.18 |
---|---|
Angular 2 애니메이션 - 부울 트리거? (0) | 2023.07.18 |
관리자 전체에서 사용할 수 있도록 장고 앱에 자세한 이름을 지정할 수 있습니까? (0) | 2023.07.18 |
ASP.NET 유효성 검사기를 사용한 날짜 유효성 검사 (0) | 2023.07.18 |
"j = ++(i | i); 및 j = ++(i & i);" 식은 값 오류여야 합니까? (0) | 2023.07.18 |