簡體   English   中英

python正則表達式可選但如果字符前面是必需的

[英]python regular expression optional but mandatory if character precedes

我試圖捕捉沿線的東西

1/2x1 + 3x2 - 4/5x3

我會事先去掉空格,這樣就沒有必要在正則表達式中捕獲它們。 正在發生的問題是我希望前面的系數可以選擇成為分數。 所以如果我看到一個/那么它必須\d+跟隨它。 我不一定關心捕獲/

理想情況下,我會這樣提取組:

# first match
match.groups(1)
('1', '2', 'x1')

#second match
('+', '3', 'x2')

#third match
('-', '4', '5', 'x3')

(有點)工作的東西是([+-])?(\d)+(\/\d)?([a-zA-Z]+\d+) 但是我不喜歡它也捕獲前面的'/'

示例輸出:

>>> regexp = re.compile('([+-])?(\d)+(\/\d)?([a-zA-Z]+\d+)')
>>> expr = '1/2a3+1/8x2-4x3'
>>> match = regexp.search(expr)
>>> match.groups(1)
(1, '1', '/2', 'a3')

>>> expr = expr.replace(match.group(0), '')
>>> match = regexp.search(expr)
>>> match.groups(1)
('+', '1', '/8', 'x2')

>>> expr = expr.replace(match.group(0), '')
>>> match = regexp.search(expr)
>>> match.groups(1)
('-', '4', 1, 'x3')

在第一場比賽中,第一個元素1是什么意思? 我在第三場比賽中看到了同樣的事情,第三個元素。 在這兩者中 - 缺少那個特定的“組”。 那么這只是一種“我匹配,但我沒有匹配任何東西”的方式嗎?

上述正則表達式的另一個問題是它使[+-]是可選的。 我希望它在第一學期是可選的,但在后續學期是強制性的。

無論如何,上面是可用的,我需要剝離/ ,我可以清理輸入以確保+-始終存在,但它並不像我確定的那樣優雅。

謝謝你的幫助

您可以稍微修改您的正則表達式以僅將捕獲組用於您想要捕獲的內容,然后使用re.findall一次提取所有匹配項:

regexp = re.compile(r'([+-])?(\d+)(?:/(\d))?([a-zA-Z]+\d+)')
res = regexp.findall(expr)

輸出:

[
 ('', '1', '2', 'a3'),
 ('+', '1', '8', 'x2'),
 ('-', '4', '', 'x3')
]

請注意,當沒有分數(或第一個值上的符號)時,元組中可能有空值( '' ),您可以(如果需要)將其過濾掉,例如

[tuple(filter(lambda x:x, tup)) for tup in res]
# [('1', '2', 'a3'), ('+', '1', '8', 'x2'), ('-', '4', 'x3')]

但是,您將面臨知道每個元組中的哪個值對應於表達式的哪個部分的困難。

暫無
暫無

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

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