>

달러 통화에 대한 정규식을 만들고 싶습니다. 이 예제는 정규식으로 찾을 수 있습니다 :

$ 10 
10$
10 $
1000005 dollars

이것은 일치하지 않아야합니다 :

dollars 33

이미이 표현을 사용했습니다 :

r_dollar = r'(\$|\$usd|usd|dollar(s)?|bucks)'
number = '([1-9]([0-9])+)'
valuta_with_num = u'(({0})\s?{1})|({1}\s?({0}))'.format(number, r_dolar)
currency_tags = re.compile(u'({0})'.format(valuta_with_num))

어떻게하면 되나요?


  • 답변 # 1

    대체를 사용하는 다른 옵션은 다음과 같습니다.

    (?:\$\s*\d+|\d+\s*(?:\$?usd|\$|dollars?|bucks))
    
    

    설명

    (?:  비 캡처 그룹

    \$\s*\d+  달러 기호 (공백 문자와 0 자릿수 + 1을 곱한 숫자)와 일치

    |  또는

    \d+\s*  1 개 이상의 숫자와 0 개 이상의 공백 문자를 찾습니다

    (?: 비 캡처 그룹

    \$?usd|\$|dollars?|bucks   \$? 옵션 중 하나와 일치  선택적인 달러 기호입니다.

    )   캡처하지 않은 그룹 닫기

    )  캡처하지 않은 그룹 닫기

    정규 데모

  • 답변 # 2

    아마도 이것을 달성하는 가장 쉬운 방법은 여러 대안을 만드는 것입니다 :

    (\$\s*\d+|\d+\s*\$|\d+\s+dollars|1 dollar)

    여기를 참조하십시오 : https://regex101.com/r/sAiDOo/2

    사소한 접근 방식이지만 훌륭하게 작동합니다. 사용 사례에 따라 줄 바꿈 괄호가 필요하지 않을 수 있습니다.

    설명 :

    우리는 | 로 구분 된 4 가지 옵션을 사용할 수 있습니다.  (파이프).

    <올>

    \$\s*\d+ : 달러 기호를 검색하고 (이스케이프해야 함) 여러 공백 ( * ) : 0 이상) 및 하나 이상의 숫자 ( + ) : 1 이상)

    \d+\s*\$ : 다른 방법으로도 같은 일이 발생합니다. 최소한 한 자리를 검색 한 다음 공백을 몇 개, 달러 기호를 검색합니다.

    \d+\s+dollars : 하나 이상의 숫자, 하나 이상의 공백, 달러 단어가 검색됩니다.

    1 dollar : 정확한 문자열 1 dollar 검색 dollars 와 일치하지 않으므로,  (복수).

  • 답변 # 3

    사용할 수 있습니다

    import re
    strs = ['Some $ 10 here', 
            'And 10$ here',
            'And 10 $  here',
            'And 1000005 dollars here',
            'And dollars one million and five here']
    r_dollar = r'(?:\$(?:usd)?|(?:dollar|buck)s?)' # USD dollar name
    r_textnumber = r'\b(?!\s)(?:[\sa-]|zero|one|tw(?:elve|enty|o)|th(?:irt(?:een|y)|ree)|fi(?:ft(?:een|y)|ve)|(?:four|six|seven|nine)(?:teen|ty)?|eight(?:een|y)?|ten|eleven|forty|hundred|thousand|[mb]illion|and)+\b(?<!\s)'
    r_number = r'(?:[1-9][0-9]+|{})'.format(r_textnumber) # Dollar amount
    valuta_with_num = r'{0}\s?{1}|{1}\s?{0}'.format(r_number, r_dollar) # Main regex
    print(valuta_with_num)
    currency_tags = re.compile(valuta_with_num)
    for s in strs:
        print(currency_tags.findall(s))
    
    

    Python 데모 온라인을 참조하십시오. 출력 :

    ['$ 10']
    ['10$']
    ['10 $']
    ['1000005 dollars']
    ['dollars one million and five']
    
    

    숫자를 단어로 일치시키는 정규식 부분은

    \b(?!\s)(?:[\sa-]|zero|one|tw(?:elve|enty|o)|th(irt(een|y)|ree)|fi(?:ft(?:een|y)|ve)|(?:four|six|seven|nine)(?:teen|ty)?|eight(?:een|y)?|ten|eleven|forty|hundred|thousand|[mb]illion|and)+\b(?<!\s)
    
    
    이 정규식 데모를 참조하십시오. 세부 정보 :

    \b(?!\s)  -공백이없는 단어 경계

    (?:\s|[a-]|zero|one|tw(?:elve|enty|o)|th(irt(een|y)|ree)|fi(?:ft(?:een|y)|ve)|(?:four|six|seven|nine)(?:teen|ty)?|eight(?:een|y)?|ten|eleven|forty|hundred|thousand|[mb]illion|and)+  -하나 이상의 공백 반복, a - zero , ..., nine ten eleven twelve ..., twenty hundred thousand million  그리고 billion

    \b(?<!\s)  -공백이없는 단어 경계.

  • 답변 # 4

    @christoph에 동의합니다 하지만 다른 방식으로 생각하면 단축 될 수 있습니다

    ^(\$|\d+)(\s*)(\d+|dollar|dollars|\$)$
    
    

    실제로보기-https://regex101.com/r/IWnHni/1

    설명

    <올>

    첫 번째 그룹 (브래킷)은 $또는 숫자와 같이 첫 번째로 올 수있는 것을 알려줍니다

    두 번째 그룹은 공간입니다

    세 번째 그룹은 $, 달러 또는 달러 또는 숫자와 같이 공백 뒤에 올 수있는 내용을 알려줍니다.

    이것이 도움이되기를 바랍니다

관련 자료

  • 이전 c++ - boost - : exception을 캐스팅하는 방법?
  • 다음 autodesk forge - {faultname} - 지정된 client_id가 api 제품에 액세스 할 수 없습니다