Jak zrobić, żeby znalazło "body" w tekście, ale tak, żeby pokazało max 20 znaków przed i po znalezionym słowie.

Jak zrobię:
results = re.findall(".{20}body.{20}", content)

to znajdzie tylko dokładne dopasowanie gdzie jest 20 znaków przed i po a ja chciałbym wszystkie body, tylko żeby pokazywało te 20 znaków przed i po znalezionym "body".

#python #regexp #regex
czy to jakieś strukturalizowane dane typu html/xml?


@qbek: Nie. Po prostu w javascript coś nie działało i szukałem, gdzie użyłem "body" oraz chciałem podejrzeć w jakim kontekście było użyte. Także to rozwiązanie {0,20} dało dobre wyniki.
#programowanie
#regex #regexp
elo. czy jest możliwośc napisania regexpa, który wyciągnie wszystkie kombinacje występujących po sobie trzech słow minimum 2 literowych?
Przykład:
Ala ma # bardzo miłego grzecznego kota
Output:
1) bardzo miłego grzecznego
2) miłego grzecznego kota

Na ten moment mam coś takiego:
[\p{IsAlphabetic}]{2,} [\p{IsAlphabetic}]{2,} [\p{IsAlphabetic}]{2,}
ale wykryte zostaje tylko 'bardzo miłego grzecznego'
@grizzly_joe: po co regexp do czegoś do czego nie jest potrzebny regex?

scala> "Ala ma # bardzo miłego grzecznego kota".split(" ").sliding(3).filter(_.forall(_.length > 2)).toList
val res5: List[Array[String]] = List(Array(bardzo, miłego, grzecznego), Array(miłego, grzecznego, kota))
#regexp #javascript #php

Mirki, potrzebuję z tekstu wyciągnąć liczbę o określonej ilości cyfr - 10
Wykminiłem coś takiego: (\d{10})
Ale wyszukuje mi też dłuższe i ucina je do 10 cyfr. Ktoś z was wie, jak to ograniczyć do wyszukiwania max 10?
Mam string:

SVC,PRO,WL CHRGE CASE-LKKT,CI/AR Purchase Order: CLC-GT-103782 Invoice AE78060885/14.03.2022 Country of Origin: VN


Jak przy pomocy #php i/lub #regexp wyciągnąć CLC-GT-103782 zakładając, że Purchase Order: oraz Invoice są zawsze po sąsiedzku?

#programowanie
Jest tu jakiś spec regexp? Potrzebuję złapać wszystko (włączając nowe linie) pomiędzy stringiem ABC i pierwszym wystąpieniem stringa XYZ. Obecnie mam:

(?=ABC)(?s)(.*)(?<=XYZ)
Ale to łapie do ostatniego się pojawienia XYZ, a nie pierwszego :(
#regexp #programowanie
@DreqX: Nie podałeś języka, ale najprościej to znaleźć indeks ABC, znaleźć indeks XYZ dalej, wziąć wszystko pomiędzy. Bez zbędnych regexów, bez przypadkowej złożoności wykładniczej, szybko, prosto, przyjemnie, a jak oba ciągi są stałe, to jeszcze może się bardzo ładnie zoptymalizować.
#regexp #regex #programowanie

Czy jest tu jakiś spec od regexów?

(?:(?!\1))(\d)\1\b
Dla stringa 888 mam full match 88, ale z tego, co rozumiem, to (?:(?!\1)) powinien eliminować ósemkę na początku i nie dać matcha. Zresztą jak zamieniam \1 na 8, to tak rzeczywiście jest. To ja już nie wiem, jak zrobić, żeby tej pierwszej grupy (w tym przypadku pojedynczej ósemki) nie brał. Rzecz w tym, że to nie muszą być
@zwei: nie pamiętam dokładnej nazwy, ale to ma chyba związek z wyszukiwaniem wstecznym. Normalnie regex jest maszyną stanów, która przetwarza tekst tylko wprzód. Tutaj masz backmatching. Rzucam tylko wskazówkę, powinieneś znaleźć odpowiednią flagę
@zwei: To (?!...) (negative lookahead) działa w odniesieniu do aktualnej pozycji (w twoim przypadku początek), więc to nic nie robi - znaczy match będzie się opierał tylko na powtórzonych ostatnich cyfrach, bo na początku sprawdzasz czy po tym co już dopasowałeś (jeszcze nic) jest coś innego niż to co będzie następne. Dlatego też non-capture nie potrzebny, bo to nie jest nawet dopasowywany ciąg tylko założenie dotyczące tego z czym "sąsiaduje".
(?!(\d)\1)\d\d\b
Serwus. Potrzebuję pilnej pomocy z regexem.
Chciałbym sobie wyłapać współrzędne geograficzne ze stringa tak żeby niezależnie od tekstu przed, separatora lub tekstu po wartościach koordynatów, tekst został rozpoznany.
Przykład:
TEXT52.405449TEXT16.883359TEXT

Jakieś pomysły?

#programowanie #regexp
@ojsak: a rzeczywiście, żeby nie matchował jak nie ma drugiej współrzędnej trzeba * w środku zmienić na + :

[^0-9]*([0-9]+\.?[0-9]*)[^0-9]+([0-9]+\.?[0-9]*)[^0-9]*
A zmianę na 0-180 zostawiam jako ćwiczenie :)
#programowanie #regexp próbuję zdebuggować moją ekspresję którą konstruuję ( #cpp #qt ) w ten sposób:

"\{ARGS" + QString("(?:[(\d+),(\w+)?\])?").repeated(64) + "\}"
czyli odpowiadającą np. napisowi takiemu jak ten:

{ARGS[2,1][10,D][2,255][10,wykop]}

z tym, że ciąg wyrazów może być dłuższy (maksymalnie 64 pary). Działało dobrze póki miałem 16 par, a teraz przy 64 dostaję brak zgodności i na http://regex101.com dostaję "catastrophic backtracking" opisane tutaj: https://www.regular-expressions.info/catastrophic.html - nie umiem jednak zrozumieć jak przerobić moją ekspresję... problem polega
@s_theCapt: poszedłbym w coś takiego (?>[([0-9]+)\,([0-9,a-z,A-Z]+)\]) i dał do tego if(x.startsWith("{ARGS") && x.endsWith("}")). W ten sposób łapie to o co chodzi i jest eszcze szybkie. Możnaby sprawdzać w 1 regexpie ale masz dodatkowe grupy i wydajność szlag trafi.
EDIT zobacz sobie w regex101, różnica jest subtelna ale powinieneś być w stanie iterować w przeciwieństwie do twojego regexa.