source

문자열에서 부동 숫자를 추출하는 방법

nicesource 2023. 7. 18. 21:48
반응형

문자열에서 부동 숫자를 추출하는 방법

다음과 유사한 문자열이 여러 개 있습니다.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

반응형