簡體   English   中英

如何在 python 中為以下模式編寫正則表達式?

[英]How do i write a regular expression for the following pattern in python?

如何在 python 中使用正則表達式查找以下模式? 對於這兩種情況

在“=”符號后尋找str2

  • 案例一: str1=str2
  • 案例 2: str1 = str2

請注意,“=”符號的兩側之間可以有空格或沒有空格

我的就是這樣,但只適用於其中一種情況!

m=re.search('(?<=str\s\=\s)\w+','str = str2')

返回 str2

幫助!

加思

如果您確實只有這么簡單的字符串要解析,則不需要正則表達式。 您可以在=上進行分區並剝離(甚至 lstrip)結果元組的最后一個元素:

>>> case = 'str = str2'
>>> case.partition('=')[2].lstrip()
'str2'

它會比正則表達式快得多。 只是為了展示我做了一個簡單的測試有多快:

>>> timeit.timeit("'str1 = str2 '.partition('=')[2].strip()")
0.49051564213846177
>>> timeit.timeit("'str1 = str2 '.split('=')[1].strip()")
0.97673281637025866
>>> timeit.timeit('import re')
0.65663786250422618
re.search(r'=\s*(.*)', 'str = str2').group(1)

或者如果你只想要一個詞:

re.search(r'=\s*(\w+)', 'str = str2').group(1)

擴展到特定的初始字符串:

re.search(r'\bstr\s*=\s*(\w+)', 'str=str2').group(1)

\b = 單詞邊界,所以不會匹配"somestr=foo"

通過所有選項一次 go 會更快,而不是一次搜索單個選項:

option_str = "a=b, c=d, g=h"
options = dict(re.findall(r'(\w+)\s*=\s*(\w+)', option_str))
options['c']  # -> 'd'

如果您的數據是固定的,那么您可以在不使用正則表達式的情況下執行此操作。 只需將其拆分為'='。 例如:

>>> case1 = "str1=str2"
>>> case2 = "str1 = str2"

>>> str2 = case1.split('=')[1].strip()
>>> str2 = case2.split('=')[1].strip()

這個YOURCASE.split('=')[1].strip()語句適用於任何情況。

只需使用拆分 function

如果您只想處理上述兩種情況,我認為正則表達式是矯枉過正的。 這就是我要做的-

>>> case1 = "str1=str2"
>>> case2 = "str1 = str2"
>>> case2.split()
['str1', '=', 'str2']
>>> ''.join(case2.split())
'str1=str2'
>>> case1[5:]
'str2'
>>> ''.join(case2.split())[5:]
'str2'
>>> 

假設

我假設您正在尋找特定的令牌“str1”。 我還假設 str1 可以分配不同的值。 類似於您在配置文件中的內容 => propertyName = value。

這只是我的看法。

我知道其他方式是可能的。 SilentGhost 提供了一個不錯的(更好的!)替代方案。

希望這可以幫助。

擴展@batbrat 的答案和其他建議,您可以使用re.split()來分隔輸入字符串。 該模式可以使用\s (空格)或顯式空格。

>>> import re
>>> c1="str1=str2"
>>> c2="str1 = str2"
>>> re.split(' ?= ?',c1)
['str1', 'str2']
>>> re.split(' ?= ?',c2)
['str1', 'str2']
>>> re.split(r'\s?=\s?',c1)
['str1', 'str2']
>>> re.split(r'\s?=\s?',c2)
['str1', 'str2']
>>> 

兩種情況:

  • (情況1)如果'='之前有一個空格,那么'='之后也必須有一個空格

    m=re.search(r'(?<=\S)(?:\s=\s|=)(\w+)','str = str2') print m.group(1)
  • (情況 2) 否則,

     m=re.search(r'(?<=\S)\s?=\s?(\w+)','str = str2') print m.group(1)

在第一種情況下,您也可以對第二個空格使用 "(?P=… .

相關想法:我發現使用圖形正則表達式工具有助於找出正確的模式: http://kodos.sf.net

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM