2015-01-29 2 views
1

мне нужно регулярное выражение, из чего-то вроде этого:Исключить начало из регулярных выражений

<li><a href="/wiki/%E1%83%90%E1%83%90%E1%83%92%E1%83%94%E1%83%91%E1%83%A1" title="ააგებს">ააგებს</a></li> 

будет соответствовать:

%E1%83%90%E1%83%90%E1%83%92%E1%83%94%E1%83%91%E1%83%A1 

До сих пор я получил:

<li><a href="/wiki/%.*\d 

Но я не знаю, как исключить начало из результата. Есть идеи? Я использую Python.

ответ

1

Не уверен, что вкус регулярных выражений, так что лучше предугадывать:

/href="\/wiki\/((?:%[a-f0-9]{2})+)"/ig 
+0

Кажется, что не работает. Я использую re library в python 2.7. – osk

1

Если вы используете язык .NET, то вы могли бы сделать это более надежно, чем только с помощью регулярных выражений, чтобы попытаться получить значение. HtmlAgilityPack хорош для анализа HTML, даже если HTML немного искажен.

Здесь у меня есть функция, которая пытается извлечь атрибут href первого элемента в куске HTML, а затем остальная часть программы показывает два способа извлечь часть href после "/ wiki /" :

Option Infer On 

Imports System.Text.RegularExpressions 
Imports HtmlAgilityPack 

Module Module1 

    ''' <summary> 
    ''' Get the value of the href attribute in the first anchor (&lt;a>) element of (a fragment of) an HTML string. 
    ''' </summary> 
    ''' <param name="s">An HTML fragment.</param> 
    ''' <returns>The value of the href attribute in the first anchor (&lt;a>) element.</returns> 
    ''' <remarks>Throws a FormatException if the href value cannot be found.</remarks> 
    Function GetHref(s As String) As String 
     ' Get the value of the href attribute, if it exists, in a reliable fashion. ' 
     Dim htmlDoc As New HtmlDocument 
     htmlDoc.LoadHtml(s) 
     Dim link = htmlDoc.DocumentNode.SelectSingleNode("//a") 
     Dim hrefValue = String.Empty 

     If link IsNot Nothing Then 
      If link.Attributes("href") IsNot Nothing Then 
       hrefValue = link.Attributes("href").Value 
      Else 
       ' there was no href ' 
       Throw New FormatException("No href attribute in the <a> element.") 
      End If 
     Else 
      ' there was no <a> element ' 
      Throw New FormatException("No <a> element.") 
     End If 

     Return hrefValue 

    End Function 

    Sub Main() 
     Dim s = "<li><a href=""/wiki/%E1%83%90%E1%83%90%E1%83%92%E1%83%94%E1%83%91%E1%83%A1"" title=""ააგებს"">ააგებს</a></li>" 

     Dim dataToCapture = String.Empty 

     Dim hrefValue = GetHref(s) 

     ' OPTION 1 - using RegEx 
     ' Only get a specific pattern of characters 
     Dim re = New Regex("^/wiki/((?:%[0-9A-F]{2})+)", RegexOptions.IgnoreCase) 
     Dim m = re.Match(hrefValue) 

     If m.Success Then 
      dataToCapture = m.Groups(1).Value 
      Console.WriteLine(dataToCapture) 
     Else 
      Console.WriteLine("Failed to match with RegEx.") 
     End If 

     ' OPTION 2 - looking at the string 
     ' Just get whatever comes after the required start of the href value. 
     Dim mustStartWith = "/wiki/" 
     If hrefValue.StartsWith(mustStartWith) Then 
      dataToCapture = hrefValue.Substring(mustStartWith.Length) 
      Console.WriteLine(dataToCapture) 
     Else 
      Console.WriteLine("Nothing found with string operations.") 
     End If 

     ' the percent-encoded data could be decoded with System.Uri.UnescapeDataString(dataToCapture) ' 

     Console.ReadLine() 

    End Sub 

End Module 

в регулярном выражении, круглые скобки, т.е. (), указывают на группу захвата. Тем не менее, нам не нужно фиксировать отдельные части %AA, поэтому у них есть модификатор ?:, чтобы указать, что они не захватываются групп.

(Ложные «s только, чтобы помочь SO цвет код правильно.)

+0

OP с тех пор обнаружил, что они используют Python 2.7, но я оставлю это здесь в надежде, что кто-то сочтет это полезным. Если нет возражений. –

0

Видя, как вы используете Python, вы можете использовать что-то вроде Python Regular Expression Testing Tool:

>>> regex = re.compile("href=\"/wiki/((?:%[0-9A-F]{2})+)\"",re.IGNORECASE) 
>>> r = regex.search(string) 
>>> r 
<_sre.SRE_Match object at 0xd640db26af2f1d60> 
>>> regex.match(string) 
None 

# List the groups found 
>>> r.groups() 
(u'%E1%83%90%E1%83%90%E1%83%92%E1%83%94%E1%83%91%E1%83%A1',) 

# List the named dictionary objects found 
>>> r.groupdict() 
{} 

# Run findall 
>>> regex.findall(string) 
[u'%E1%83%90%E1%83%90%E1%83%92%E1%83%94%E1%83%91%E1%83%A1'] 

где string установлен в ваши данные примера.

Однако, как и в случае с .NET, было бы лучше проанализировать HTML с чем-то вроде BeatifulSoup, чтобы получить значение href, а затем работать над этим.

Смежные вопросы